Iam essayant de créer un serveur itératif basé sur des sockets datagram (UDP). Il appelle se connecter au premier client qu'il obtient à partir du premier appel recvfrom() (oui, je sais que ce n'est pas une connexion réelle). Après avoir servi ce client, je déconnecte le socket UDP (appel de connexion avec AF_UNSPEC) Puis j'appelle recvfrom() pour obtenir le premier paquet du client suivant.Déconnexion et reconnexion d'une socket de datagramme connectée
Maintenant, le problème est, que l'appel de recvfrom() dans la deuxième itération de la boucle renvoie 0. Mes clients n'envoient jamais de paquets vides, donc ce qui pourrait se passer.
C'est ce que fait Iam (pseudocode):
s = socket(PF_INET, SOCK_DGRAM, 0)
bind(s)
for(;;)
{
recvfrom(s, header, &client_address) // get first packet from client
connect(s,client_address) // connect to this client
serve_client(s);
connect(s, AF_UNSPEC); // disconnect, ready to serve next client
}
EDIT: J'ai trouvé le bogue dans mon client d'envoyer par mégarde un paquet vide. Maintenant, mon problème est comment faire attendre le client pour être servi au lieu d'envoyer une requête dans nulle part (le serveur est connecté à un autre client et ne sert pas encore d'autre client). Connect() est vraiment complètement inutile sur SOCK_DGRAM
Connect définit un filtre interne à partir duquel l'adresse est reçue et envoyée à l'aide de send() ou recv(). recv(): "Pour les sockets SOCK_DGRAM, les données sont extraites du premier datagramme mis en file d'attente pour l'adresse de destination spécifiée dans l'appel de connexion". – codymanix
Vous avez raison, mon client envoyait (en raison d'un bug) un paquet vide. Maintenant j'ai un autre problème. Le client qui doit attendre dans la file d'attente pour être servi envoie son premier paquet de requête (qui n'est jamais reçu du serveur). Ensuite, il essaie de recevoir la réponse et recv renvoie -1. Comment puis-je faire attendre le client? – codymanix
êtes-vous toujours confronté à ce problème (la partie Modifier de votre message) ou est-il résolu en supprimant se connecter. –