在 Windows 7 上向计算机发送两条 UDP 消息时,有时第一条消息似乎根本没有发送。有没有其他人遇到过这种情况?
下面的测试代码演示了我机器上的问题。当我运行测试程序并观察到 10.10.42.22 的所有 UDP 流量时,我看到正在发送第二条 UDP 消息,但未发送第一条 UDP 消息。如果我立即再次运行该程序,则会发送两个 UDP 消息。
它不会每次都失败,但如果我在再次运行测试之前等待几分钟,它通常会发生。
#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;
}
最佳答案
这里的问题和this post基本一样它与 RFC 1122 的第 2.3.2.2 节有关:
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.
看起来为每个 UDP 消息打开一个新套接字是一种解决方法。
关于windows - 在 Windows 7/2008 R2 上有时不发送套接字消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382275/