UDP未连接套接字发送失败,直到收到第一个数据报

时间:2015-01-15 23:39:20

标签: sockets networking udp winsock

我在Windows 7中使用Winsock类CAsyncSocket来创建UDP聊天程序。它只是打开一个未连接的UDP套接字,并允许将文本字符串发送到另一台运行聊天程序的计算机。我发现,当我的聊天程序在两台计算机上运行时,以太网网卡与交叉电缆连接(因此没有其他网络流量),无论哪台计算机首先尝试传输,直到第一张数据报出现之后才会失败。从另一台计算机发送。在下面的屏幕截图中,计算机#1尝试发送" test"没有它被计算机#2接收三次。然后计算机#2发送"你好"由#1接收。然后计算机#1发送" test"再次,这次它收到了。虽然三个初始传输"测试"来自#1似乎没有通过他们显然做了一些事情,如果"你好"来自#2的测试是在"测试"之前发送的。来自#1的消息然后是"你好"消息是丢失的消息。

计算机#1

Station 1

计算机#2

Station 2

每台计算机成功发送数据报后,所有后续数据报都会毫无问题地发送和接收。如果我只在一侧关闭并重新打开插座 [重置本地端口] ,则每台计算机仍然可以成功发送和接收。如果我 [重置本地端口] 两台计算机,那么在大多数情况下,第一个发送的设备遇到同样的问题,但并非总是如此。有时即使发送和接收上的 [重置本地端口] 仍然有效。 创建未连接套接字的调用是

 Create(i_LocalPort, SOCK_DGRAM, FD_READ, m_LocalSockAddrIn.AddrStr());

然后

CAsyncSocket::SendTo()

发送数据报。寻找一些关于这里发生了什么的提示。

更新信息:使用Wireshark查看丢失的数据包似乎与适当的源和目标地址一起发送,但目标未收到它们。 Datagram Capture

1 个答案:

答案 0 :(得分:2)

问题是由Windows防火墙引起的。我在两台计算机上都关闭了防火墙,问题就消失了。通常,Windows在阻止访问时会弹出一个对话框,但其中一台计算机已禁用 “当Windows防火墙阻止新程序时通知我” ,因此没有对话框消息。它只是默默地丢弃了数据报。我希望在发送消息后允许Datagrams通过的原因是它有一个例外,允许从程序发送到的端口接收。因此,在发送到其他端口后,可以从中接收。