servidor - socket udp c
¿Cómo crear un servidor UDP en C? (2)
No es necesario listen(2)
en un socket UDP, como menciona @cnicutar, que es para TCP. Solo recv(2)
o recvfrom(2)
.
Estoy tratando de escribir un servidor UDP en C (bajo Linux). Sé que en la función socket()
debo usar SOCK_DGRAM
y no SOCK_STREAM
.
if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 )
{
fprintf(stderr, "ERROR");
}
Pero ahora, cuando intento ejecutar el programa (no hay errores en la compilación), 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 descubrir 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);
}
No puedes listen
en un socket de datagrama, simplemente no está definido para eso. Solo necesita bind
y comenzar a leer en un bucle.
Como breve explicación, listen
informa al sistema operativo que debe esperar conexiones en ese socket y que las aceptará más adelante. Obviamente eso no tiene sentido para los sockets de datagramas, por lo tanto, el error.
Nota al perror
: debería intentar usar perror
para imprimir dichos errores. En este caso, (probablemente) habría dicho Operación no compatible .