Serveur en C acceptant les connexions UDP et TCP

J’ai un problème. J’ai développé un serveur en C pouvant accepter les connexions des clients UDP et TCP. J’ai donc besoin de savoir quand une connexion est UDP et quand c’est un TCP. J’ai déjà développé les deux cas séparément, et ils fonctionnent bien.

J’ai cherché comment faire cela, et tout pointe vers la fonction select () , mais je ne sais pas comment l’utiliser pour cela. Quelqu’un peut-il me montrer un exemple ou quelque chose qui accepte les connexions UDP et TCP … Je suis vraiment perdu.

Merci beaucoup…

Commencez par ouvrir chaque socket côté serveur. Les sockets BSD nécessitent que vous ouvriez séparément TCP et UDP. Comme vous le savez sans doute déjà, chaque socket a un descripteur de fichier, qui est un petit entier.

Une fois que tout est prêt, créez une variable de type fdset , qui est un ensemble de descripteurs de fichier. La mini-API pour le type fdset comprend:

  • FD_ZERO(set) , ce qui efface le set.
  • FD_SET(socket,set) , qui ajoute le descripteur de la socket à l’ensemble (active le bit sur l’entier).
  • FD_CLR(socket,set) , qui supprime le socket de l’ensemble.
  • FD_ISSET(socket,set) , qui renvoie non nul si la socket est dans l’ensemble.

Alors, ce que vous allez faire c’est:

  • Créez quatre variables fdset . Un pour contenir votre liste complète de sockets et trois espaces de travail pour tester la lecture, l’écriture et les exceptions. Effacez-les avec FD_ZERO() .
  • Avec FD_SET() , ajoutez vos sockets à la liste complète.
  • Dans la boucle de votre serveur, utilisez FD_ISSET() et FD_SET() pour copier la liste des sockets de la liste complète dans la liste de lecture (et d’autres, si vous en avez besoin).
  • Appeler select() . Cela ressemblera à quelque chose comme select(biggest_socket_fd, readSockets, writeSockets, exceptionSockets, timeout) . L’appel éteint tout ce qui n’est pas prêt dans l’ensemble.
  • FD_ISSET(i,readSockets) numéros de socket possibles en demandant à FD_ISSET(i,readSockets) . J’espère que vous avez recvfrom() quelle socket utilise quel protocole et pouvez recvfrom() exécution vers accept() ou recvfrom() .

Notez que, pour éviter la famine, vous voulez vous assurer que votre boucle interne garde une trace de l’endroit où elle s’est arrêtée en dernier. Si vous avez un millier de sockets et que vous faites quelque chose comme for (i=0;i<1000;i++){} , les sockets à plus petit nombre auront un avantage en termes de service.

Utilisez select () ci-dessous est la sortie de man select

 select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (eg, input possible). A file descriptor is considered ready if it is possible to perform the corresponding I/O operation (eg, read(2)) without blocking.