Comment créer un serveur UDP en C?

J’essaie d’écrire un serveur UDP en C (sous Linux). Je sais que dans la fonction socket() , je dois utiliser SOCK_DGRAM et non SOCK_STREAM .

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

Mais maintenant, quand j’essaye de lancer le programme (pas d’erreur de compilation), ça indique qu’il y a une erreur dans listen() . Voici l’appel à cela:

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

Pouvez-vous comprendre quel est le problème? C’est le code:

 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); } 

Vous ne pouvez pas listen sur un socket de datagramme, il n’est tout simplement pas défini pour cela. Vous avez seulement besoin de vous bind et de commencer à lire en boucle.

En guise d’explication brève, listen informe le système d’exploitation qu’il doit s’attendre à des connexions sur ce socket et que vous les accepterez plus tard. Évidemment, cela n’a aucun sens pour les sockets datagrammes, donc l’erreur.


Remarque secondaire: vous devriez essayer d’utiliser perror pour imprimer de telles erreurs. Dans ce cas, il aurait (probablement) indiqué que l’ opération n’était pas prise en charge .

Inutile d’ listen(2) sur un socket UDP, comme @cnicutar le mentionne, c’est-à-dire pour TCP. Juste recv(2) ou recvfrom(2) .