2011-11-19 12 views
5

Zacząłem czytać i uczyć się o "gniazdach", ale szukam małej próbki kodu napisanej w C dla klienta i serwera, która nie będzie blokować sięNie blokujące się gniazda klienta i serwera w C

Kod powinien być w stanie wysyłać dane wejściowe od klienta, a serwer musi mieć możliwość odbierania danych wyjściowych w stanie nieblokującym, oba powinny być w stanie nieblokującym.

Wiele czytałem w Google i książkach, YouTube, ale nic nie pomogło.

To jest mój serwer:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    int sock; 
    int addr_len, bytes_read; 
    char recv_data[1024]; 
    struct sockaddr_in server_addr , client_addr; 


    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     perror("Socket"); 
     exit(1); 
    } 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(5000); 

    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    bzero(&(server_addr.sin_zero),8); 


    if (bind(sock,(struct sockaddr *)&server_addr, 
      sizeof(struct sockaddr)) == -1) 
    { 
     perror("Bind"); 
     exit(1); 
    } 

    addr_len = sizeof(struct sockaddr); 

    printf("\nUDPServer Waiting for client on port 5000"); 
    fflush(stdout); 

    while (1) 
    { 

     bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); // <---- Here is the problem 


     recv_data[bytes_read] = '\0'; 

     printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr), 
       ntohs(client_addr.sin_port)); 
     printf("%s", recv_data); 
     fflush(stdout); 

    } 
    return 0; 
} 

Odpowiedz

9

Chyba pytasz jak wykonać I/O na gnieździe non-blocking. Beej's guide istnieje od dłuższego czasu; obejmuje to wszystko i więcej, z dobrymi próbkami kodu.

+1

Witaj Bret - użyłem przewodnika Beej, ale nie mogłem go dostać .. proszę pomóż mi z exampelem zamiast ... – user1022734

+1

Przewodnik Beej'a jest całkiem jasny i ma przykładowe programy do tego, co próbujesz osiągnąć. Zobacz rozdział 7 przewodnika. Pierwszy kod to klient, a drugi to serwer. – steve

6

Pomysł z niewpuszczającymi blokad we/wy polega na tym, aby móc obsłużyć gniazda wielu bez uciekania się do wielu wątków. Środkowa część tutaj to I/O de-multiplexing, to jest połączenie z select(2) lub poll(2) (lub funkcje specyficzne dla platformy, takie jak epoll(7) lub kqueue(2)).

Oto krótki introduction.

+0

Jak mogę "wybrać()" na moim serwerze? – user1022734

+0

Twoja pętla czeka w 'select()', a następnie sprawdza, czy którekolwiek z zarejestrowanych gniazd są odczytywalne (w wewnętrznej pętli), a następnie odczytuje z każdego aktywnego gniazda. –

+0

kod exampel proszę, mój angielski nie jest dobry – user1022734

Powiązane problemy