我在Windows 7中使用Winsock类CAsyncSocket创建UDP聊天程序。它只是打开一个未连接的UDP套接字,并允许将文本字符串发送到另一台同时运行聊天程序的计算机。我发现,当我的聊天程序在两台计算机上运行时,两台计算机都使用交叉网线连接了以太网NIC(因此没有其他网络流量),无论哪台计算机先尝试传输,直到从另一台计算机发送第一个数据报之后,该计算机都不会成功。在下面的屏幕截图中,计算机1尝试发送“测试”三次,而计算机2没有收到它。然后,计算机#2发送“你好”,它被#1接收。然后,计算机1再次发送“测试”,并且这次被接收。尽管“测试”的三个初始传输
1号电脑
2号电脑
在每台计算机成功发送完数据报之后,所有后续数据报都将毫无问题地发送和接收。如果仅在一侧关闭并重新打开[Reset Local Port]套接字,则每台计算机仍然可以成功发送和接收。如果我同时重置两台计算机,则在大多数情况下,第一个要发送的计算机会遇到相同的问题,但并非总是如此。有时即使在[重置本地端口]之后,发送和接收仍然可以正常工作。创建未连接套接字的调用是
Create(i_LocalPort, SOCK_DGRAM, FD_READ, m_LocalSockAddrIn.AddrStr());
接着
CAsyncSocket::SendTo()
发送数据报。寻找有关此处发生情况的一些提示。
更新信息:使用Wireshark查看时,丢失的数据包确实与适当的源地址和目标地址一起发送,但目的地未收到它们。
该问题是由Windows防火墙引起的。我关闭了两台计算机上的防火墙,问题消失了。通常,Windows在阻止访问时会弹出对话框,但是其中一台计算机已禁用“ Windows防火墙阻止新程序时通知我”,因此没有对话框消息。它只是默默地丢弃了数据报。我希望发送消息后允许数据报通过的原因是它有一个例外,允许从程序已发送到的端口进行接收。因此,在发送到另一个端口之后,便可以从该端口进行接收。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句