首页 文章

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

提问于
浏览
3

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

Computer #1

Station 1

Computer #2

Station 2

在每台计算机成功发送数据报之后,所有后续数据报都会毫无问题地发送和接收 . 如果我关闭并仅在一侧重新打开套接字 [Reset Local Port] ,那么每台计算机仍然可以成功发送和接收 . 如果我 [Reset Local Port] 两台计算机,那么在大多数情况下,第一个发送的经历同样的问题,但并非总是如此 . 有时甚至在 [Reset Local Port] 之后发送和接收仍然有效 . 创建未连接套接字的调用是

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

然后

CAsyncSocket::SendTo()

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

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

1 回答

  • 2

    该问题是由Windows防火墙引起的 . 我在两台计算机上都关闭了防火墙,问题就消失了 . 通常,Windows在阻止访问时会弹出一个对话框,但其中一台计算机已禁用 "Notify me when Windows Firewall blocks a new program" ,因此没有对话框消息 . 它只是默默地丢弃了数据报 . 我希望在发送消息后允许Datagrams通过的原因是它有一个例外,允许从程序发送到的端口接收 . 因此,在发送到其他端口后,可以从中接收 .

相关问题