2012-05-25 56 views
9

Estoy intentando escribir un servidor UDP en C (en Linux). Sé que en la función socket() debo usar SOCK_DGRAM y no SOCK_STREAM.¿Cómo crear un servidor UDP en C?

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

Pero ahora, cuando trato de ejecutar el programa (no hay errores en la compilación), se dice que hay un error en listen(). Aquí está la llamada:

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

¿Puedes averiguar cuál es el problema? Este es el código:

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

Como observación general, muchas funciones darán más información sobre el error que se produjo a través de errno. Siempre es conveniente verificar (y registrar) errno, ver también strerror. – fvu

+0

Fuera de tema: '//' los comentarios están permitidos en C++ pero no en C ... –

+2

@EitanT son parte de C99 – fvu

Respuesta

22

Puede no listen en un socket de datagramas, es simplemente no definido para ella. Solo necesita bind y comienza a leer en un bucle.

Como explicación breve, listen informa al sistema operativo que debe esperar conexiones en ese socket, y que las va a aceptar más adelante. Obviamente eso no tiene sentido para los sockets de datagramas, por lo tanto, el error.


Nota al margen: usted debe tratar de utilizar perror para imprimir este tipo de errores. En este caso, (probablemente) habría dicho Operación no admitida.

3

No es necesario listen(2) en un socket UDP, como menciona @cnicutar, que es para TCP. Solo recv(2) o recvfrom(2).