2012-05-25 22 views
9

Sto provando a scrivere un server UDP in C (sotto Linux). So che nella funzione socket() devo usare SOCK_DGRAM e non SOCK_STREAM.Come creare un server UDP in C?

if ((list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
{ 
    fprintf(stderr, "ERROR"); 
} 

Ma ora, quando si tenta di eseguire il programma (nessun errore nella compilazione), si dice che c'è un errore in listen(). Ecco la chiamata:

if (listen(list_s, 5) < 0) 
{ 
    fprintf(stderr, "ERROR IN LISTEN"); 
    exit(EXIT_FAILURE); 
} 

Riesci a capire qual è il problema? Questo è il codice:

int  list_s;    /* listening socket   */ 
int  conn_s;    /* connection socket   */ 
short int port;     /* port number    */ 
struct sockaddr_in servaddr; /* socket address structure */ 

if ((list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
{ 
    fprintf(stderr, "ERROR\n"); 
} 

memset(&servaddr, 0, sizeof(servaddr)); 
servaddr.sin_family  = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servaddr.sin_port  = htons(port); 

if (bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 
{ 
    fprintf(stderr, "ERROR IN BIND \n"); 
} 

if (listen(list_s, 5) < 0)  // AL POSTO DI 5 LISTENQ 
{ 
    fprintf(stderr, "ERROR IN LISTEN\n"); 
    exit(EXIT_FAILURE); 
} 
+1

Come osservazione generale, molte funzioni daranno maggiori informazioni sull'errore che si è verificato tramite errno. È sempre consigliabile controllare (e registrare) errno - vedi anche strerror. – fvu

+0

Off-topic: '//' I commenti sono permessi in C++ ma non in C ... –

+2

@EitanT fanno parte di C99 – fvu

risposta

22

Non si può listen su un socket datagram, è semplicemente non definito per esso. Hai solo bisogno di bind e inizia a leggere in un ciclo.

Come spiegazione breve, listen informa il sistema operativo che dovrebbe aspettarsi connessioni su tale socket e che le accetterà in un secondo momento. Ovviamente questo non ha senso per i socket dei datagrammi, quindi l'errore.


Nota a margine: si dovrebbe cercare di utilizzare perror per stampare tali errori. In questo caso avrebbe (probabilmente) dichiarato Operazione non supportata.

3

Non c'è bisogno di listen(2) su un socket UDP, come cita @cnicutar, cioè per TCP. Solo recv(2) o recvfrom(2).