2010-12-07 53 views
4

Lors de l'envoi de deux messages UDP à un ordinateur sous Windows 7, il semble que parfois le premier message ne soit pas envoyé du tout. Quelqu'un d'autre a-t-il vécu cela?Message de socket parfois non envoyé sous Windows 7/2008 R2

Le code de test ci-dessous illustre le problème sur ma machine. Lorsque j'exécute le programme de test et que j'observe tout le trafic UDP à 10.10.42.22, je vois que le second message UDP est envoyé, mais le premier message UDP n'est pas envoyé. Si je réexécute immédiatement le programme, les deux messages UDP sont envoyés.

Il n'échoue pas à chaque fois, mais cela arrive généralement si j'attends quelques minutes avant de recommencer le test.

#include <iostream> 
#include <winsock2.h> 

int main() 
{ 
WSADATA wsaData; 
WSAStartup(MAKEWORD(2,2), &wsaData); 

sockaddr_in addr; 
addr.sin_family = AF_INET; 
addr.sin_port = htons(52383); 
addr.sin_addr.s_addr = inet_addr("10.10.42.22"); 

SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

if (sendto(s, "TEST1", 5, 0, (SOCKADDR *) &addr, sizeof(addr)) != 5) 
    std::cout << "first message not sent" << std::endl; 

if (sendto(s, "TEST2", 5, 0, (SOCKADDR *) &addr, sizeof(addr)) != 5) 
    std::cout << "second message not sent" << std::endl; 

closesocket(s); 

WSACleanup(); 
return 0; 
} 
+0

Est-ce que le premier message n'est pas envoyé lorsque le problème survient? – sje397

+0

Non, sendto renvoie toujours le succès. – briangreenery

Répondre

3

Le problème ici est essentiellement le même que this post et il a à voir avec la section 2.3.2.2 de la RFC 1122:

2.3.2.2 ARP Packet Queue

La couche liaison DEVRAIENT enregistrer (plutôt que rejeter) au moins un (le dernier) paquet de chaque ensemble de paquets destinés à la même adresse IP non résolue, et transmettre le paquet enregistré lorsque le l'adresse a été résolue.

Il semble que l'ouverture d'un nouveau socket pour chaque message UDP est une solution de contournement.

+0

+1 Belle trouvaille ... –