【发布时间】:2015-03-14 12:42:44
【问题描述】:
我在 Windows 7 中使用 Winsock 类 CAsyncSocket 来创建一个 UDP 聊天程序。它只是打开一个未连接的 UDP 套接字,并允许将文本字符串发送到另一台运行聊天程序的计算机。我发现当我的聊天程序在两台计算机上运行时,其以太网网卡通过交叉电缆连接(因此没有其他网络流量),无论哪台计算机首先尝试传输它都是不成功的,直到从另一台计算机发送第一个数据报之后。在下面的屏幕截图中,计算机 #1 尝试发送“测试”三次,但计算机 #2 没有接收到它。然后计算机#2 发送由#1 接收的“hello”。然后计算机#1 再次发送“测试”,这次它被接收。尽管来自 #1 的“test”的三个初始传输似乎没有通过,但它们显然做了一些事情,如果来自 #2 的“hello”在来自 #1 的“test”消息之前发送,那么“hello”消息就是丢失了。
1 号计算机
2 号计算机
在每台计算机成功发送数据报之后,所有后续数据报都可以顺利发送和接收。如果我只在一侧关闭并重新打开套接字[Reset Local Port],那么每台计算机仍然可以成功发送和接收。如果我[重置本地端口]两台计算机,那么在大多数情况下,第一个发送的计算机会遇到相同的问题,但并非总是如此。有时即使在发送和接收 [重置本地端口] 之后仍然有效。 创建未连接套接字的调用是
Create(i_LocalPort, SOCK_DGRAM, FD_READ, m_LocalSockAddrIn.AddrStr());
然后
CAsyncSocket::SendTo()
发送数据报。寻找一些关于这里发生了什么的提示。
更新信息:使用 Wireshark 查找丢失的数据包似乎是使用适当的源地址和目标地址发送的,但目的地没有收到它们。
【问题讨论】:
-
您的 NIC 是否配置为使用 DHCP?如果是这样,则交叉电缆正在从您的网络中消除所有可能的 DHCP 服务器,因此它们都没有 IP 地址,这可以解释这一点。这不是一个现实的情况来测试。
-
我采用了交叉和静态 IP 地址来尝试消除其他变量,例如网络交换机不传递数据报或其他导致 UDP 失败的网络流量。在我使用 DHCP 的本地 LAN 上,我第一次看到同样的问题。
-
我仍在尝试解决此问题。我已经用其他 UDP 聊天程序进行了测试,并且发现这些程序也无法接收数据报。我现在怀疑网络环境。我尝试使用udp-win-chat.software.informer.com/download 并且有一个案例,在交叉电缆上使用隔离网络发送和接收并运行 WireShark 我看到双方发送的数据报,但 udpchat 程序均未显示已收到任何内容。
-
问题依然存在。这是你真正关心的案例吗?它可以在适当的网络上运行吗?
-
来自之前的评论“我第一次看到同样的问题是在我的本地局域网上使用 DHCP。”
标签: sockets networking udp winsock