Socket message sometimes not sent on Windows 7 / 2008 R2
udp, windows, windows-7, winsock
Solution
The problem here is basically the same as this post and it has to do with section 2.3.2.2 of RFC 1122:
2.3.2.2 ARP Packet Queue
The link layer SHOULD save (rather than discard) at least one (the latest) packet of each set of packets destined to the same unresolved IP address, and transmit the saved packet when the address has been resolved.
It looks like opening a new socket for every UDP message is a workaround.
Problem
When sending two UDP messages to a computer on Windows 7, it looks like sometimes the first message is not sent at all. Has anyone else experienced this? The test code below demonstrates the issue on my machine. When I run the test program and watch all UDP traffic to 10.10.42.22, I see the second UDP message being sent, but the first UDP message is not sent. If I immediately run the program again, then both UDP messages are sent. It doesn't fail every time, but it usually happens if I wait a couple minutes before running the test again. ``` #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; } ```