Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets UDP未连接套接字发送失败,直到收到第一个数据报_Sockets_Networking_Udp_Winsock - Fatal编程技术网

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

Sockets UDP未连接套接字发送失败,直到收到第一个数据报,sockets,networking,udp,winsock,Sockets,Networking,Udp,Winsock,我在Windows7中使用Winsock类CAsyncSocket创建UDP聊天程序。它只需打开一个未连接的UDP套接字,并允许将文本字符串发送到另一台运行聊天程序的计算机。我发现,当我的聊天程序在两台通过交叉电缆连接以太网NIC的计算机上运行时(因此没有其他网络流量),无论哪台计算机先尝试传输,都会失败,直到从另一台计算机发送第一个数据报。在下面的屏幕截图中,计算机#1尝试发送“测试”三次,而计算机#2没有收到它。然后计算机#2发送#1接收到的“你好”。然后计算机#1再次发送“测试”,这一次它

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

计算机#1

计算机#2

在每台计算机成功发送数据报后,所有后续数据报都会顺利发送和接收。如果我仅在一侧关闭并重新打开套接字[重置本地端口],则每台计算机仍然可以成功发送和接收。如果我[Reset Local Port]两台计算机,则在大多数情况下,第一台发送的计算机会遇到相同的问题,但并不总是如此。有时,即使在发送和接收的[Reset Local Port]之后,仍能正常工作。 创建未连接套接字的调用为

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

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

更新信息:使用Wireshark查找丢失的数据包时,数据包似乎是以适当的源地址和目标地址发送的,但目标没有收到这些数据包。
问题是由Windows防火墙引起的。我关闭了两台计算机上的防火墙,问题消失了。通常Windows在阻止访问时会显示一个对话框,但其中一台计算机已禁用“Windows防火墙阻止新程序时通知我”,因此没有对话框消息。它只是默默地丢弃了数据报。我认为它允许数据报在消息发送后通过的原因是它有一个异常,允许从程序发送到的端口接收数据。因此,在发送到另一个端口后,就可以从该端口接收

您的NIC是否配置为使用DHCP?如果是这样,交叉电缆将从您的网络中删除所有可能的DHCP服务器,因此它们都没有IP地址,这可以解释这一点。这不是一个现实的测试情况。我求助于交叉和静态IP地址,试图消除其他变量,如网络交换机不传递数据报或其他导致UDP失败的网络流量。我第一次看到同样的问题是在我使用DHCP的本地局域网上。我仍在努力解决这个问题。我已经用其他UDP聊天程序进行了测试,发现用这些程序接收数据报也失败了。我现在怀疑网络环境。我曾尝试使用过一种情况,即通过交叉电缆和运行WireShark的隔离网络发送和接收数据,我看到了从两侧发送的数据报,但udpchat程序均未显示收到任何数据。问题仍然存在。你真的在乎这个案子吗?它在一个合适的网络上工作吗?从前面的评论“我第一次看到这个问题的地方是在使用DHCP的本地局域网上。”读了你的问题后,我非常兴奋地建议禁用Windows防火墙,并给我50分的奖金。德拉特正如您所注意到的,Windows防火墙默认情况下不允许入站连接。由于UDP不是一个有状态的协议,它需要一个传出数据包来表示您已经建立了一个传出连接。