La mise en œuvre de sockets UDP avec sélectionnez dans C

Je me suis mise en œuvre d'un socket projet de programmation en C. je suis en utilisant select() pour l'attente des données du client. J'ai deux sockets UDP et select() est toujours en ignorant l'un de mes supports.

Quelqu'un peut-il décrire brièvement où dois-je commencer à chercher pour elle? C'est ce que mon serveur est en train de faire

waitThreshold.tv_sec = 5000; 
waitThreshold.tv_usec = 50; 
if (sd > sd1)
    max_sd = (sd + 1);
else if(sd1 > sd)   
    max_sd = (sd1 + 1);
FD_ZERO(&read_sds); 
FD_SET(sd, &read_sds); 
FD_SET(sd1, &read_sds);   

ret = select(max_sd, &read_sds, NULL, NULL, &waitThreshold); 
if (ret < 0) {
    printf("\nSelect thrown an exception\n");   
    return 0;
} else if (FD_ISSET(sd, &read_sds)) { 
    //code for socket one 
} else if (FD_ISSET(sd1, &read_sds)) {
    //code for socket two 
}
  • Un trou dans la chaussette... Oh, attendez, non, c'est un socket.
  • Il n'y a pas assez d'informations ici pour quiconque de savoir ce que vous faites mal. Voyez si vous pouvez faire un exemple minimal et après le code. Êtes-vous d'ajouter les deux sockets à la fd_sets? Est le premier paramètre de select() définie à la plus forte valeur de descripteur de fichier plus un?
  • Oui, il est configuré pour plus un plus un. Je vais éditer et de publier quelques de mycode ici, je n'arrivais pas à savoir combien et quel post coz ses un gros projet
  • J'ai ajouté le code dans ma question, des commentaires?? @svk stackoverflow.com/users/2151753/svk
  • Aussi loin que je peux voir que le code a l'air bien. Vous n'avez pas besoin d'autre des clauses -- vous pourriez avoir des données sur la sd et sd1, mais je ne pense pas que cela devrait être un problème, sauf si vous vous êtes totalement inondé avec des données sur la première prise. Le problème peut ne pas être dans cette partie de votre code. Voir si vous pouvez faire un petit exemple qui montre votre problème et qui est complète, de sorte qu'il peut être compilé et exécuté.
  • J'ai trouvé la solution à mon problème. J'ai gardé ceux si elses dans le while(1) de la boucle. À chaque itération, je FD-ZÉRO et FD_SET ceux readfds. Je n'ai qu'à l'extérieur, alors que, chaque fois qu'il prenait une seule prise comme son bit correspondant a toujours été ensemble. Merci pour votre réponse.
  • Au lieu de la else/if's, vous devez en boucle sur la read_sds ensemble. Actuellement, vous sont un appel à select() une fois pour tous les lire d'action que vous prenez, ce qui est un gaspillage: vous devez l'appeler une fois et tous les processus de la lecture des actions. À moins de se débarrasser de la elses.
  • double possible de les sockets UDP utilisation de select()

InformationsquelleAutor Shreyas Kale | 2013-03-23