2015-01-15 30 views
2

我在Windows 7中使用Winsock类CAsyncSocket创建一个UDP聊天程序。它只是打开一个未连接的UDP套接字,并允许将文本字符串发送到另一台运行该聊天程序的计算机。我发现当我的聊天程序运行在两台带有以太网NIC的交叉网线连接的计算机上时(无其他网络流量),无论哪台计算机首先尝试传输,直到从另一台计算机发送第一个数据报之后,它都不成功。在以下屏幕捕获计算机#1尝试发送三次“​​测试”,而计算机#2未收到它。然后计算机#2发送由#1接收的“hello”。然后计算机#1再次发送“测试”并且这次它被接收。尽管从#1开始的“测试”的三次初始传输看起来没有经过,但他们显然做了一些事情,如果在#1的“测试”消息之前发送来自#2的“hello”,则“hello”消息是丢失了。UDP未连接套接字发送失败,直到它收到第一个数据报

计算机#1

Station 1

计算机#2

Station 2

后每台计算机已经成功地发送数据报则所有随后的数据报没有发送和接收问题。如果我只关闭并重新打开一个端口[重置本地端口],那么每台计算机仍可以成功发送和接收数据。如果我[重置本地端口]两台电脑,然后在大多数情况下,第一个发送经验相同的问题,但并不总是。有时甚至在[重置本地端口]发送和接收仍然工作。 创建未连接套接字的调用是

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

然后

CAsyncSocket::SendTo() 

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

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

+0

您的网卡是否配置为使用DHCP?如果是这样,交叉电缆将从网络中消除所有可能的DHCP服务器,因此它们都没有IP地址,这可以解释它。测试不是一个现实的情况。 – EJP

+0

我诉诸交叉和静态IP地址,试图消除其他变量,如网络交换机不通过数据报或其他网络通信导致UDP故障。它在我的本地局域网上,我首先看到了这个问题。 – JonN

+0

我仍在尝试解决此问题。我已经与其他UDP聊天程序进行了测试,并发现无法使用这些程序接收数据报。我现在怀疑网络环境。我尝试使用 http://udp-win-chat.software.informer.com/download/ 并有一个情况,发送和接收 与交叉电缆上的隔离网络和运行WireShark我看到发送的数据报从双方但没有udpchat程序显示为收到任何东西。 – JonN

回答

1

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

+0

阅读完您的问题后,我很兴奋地建议禁用Windows防火墙并让我获得50点奖励。讨厌鬼。 ;)如您所知,Windows防火墙默认情况下不允许入站连接。由于UDP不是一个有状态的协议,它需要一个传出数据包来表示你已经建立了一个传出连接。 – Zenexer

相关问题