socket servidor hacer example con como code cliente c sockets udp bind listen

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 .