【问题标题】:UDP unconnected socket sending fails until it receives 1st datagramUDP 未连接的套接字发送失败,直到它接收到第一个数据报
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 阅读您的问题后,我很高兴建议禁用 Windows 防火墙并获得 50 分赏金。德拉特。 ;) 正如您所注意到的,默认情况下,Windows 防火墙不允许入站连接。由于 UDP 不是有状态协议,因此它需要一个传出数据包来表示您已经建立了传出连接。
猜你喜欢
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2013-08-28
相关资源
最近更新 更多