由Wireshark捕获但不是应用程序的UDP数据包

时间:2014-07-15 16:23:13

标签: c windows-8 udp wireshark

我有一个带有两个以太网适配器的Windows 8系统(专门用于测试网络内容)。我正在编写一个应用程序,它将在端口4950上通过整个本地网络发送"Are you there?" UDP广播,然后等待来自端口4951上"Yes I'm here."的FPGA板的任何响应。

问题是在Windows 8中(也可能在旧版本中),向255.255.255.255发送广播实际上只选择主网络适配器,但我的应用程序必须向我的每个网络适配器发送广播电脑。我将广播硬编码到IP地址169.254.66.143的第二个(非主要)NIC(网络掩码为255.255.0.0),因此应用程序广播到169.254.255.255以确定是否有电路板位于第二个NIC的网络上。

主板本身的静态IP地址为169.254.1.1,因此当我的应用程序通过辅助NIC广播时,FPGA板会收到广播消息("Are you there?")(我可以确认这一点)因为电路板会告诉我通过串口接收以太网广播)。奇怪的是,虽然电路板确实在4951的正确端口上发送了响应,但我的应用程序从未收到响应,而Wireshark 在收听辅助NIC时会看到响应数据包。

此外,当我尝试联系任何主板失败之前和之后运行netstat -s时,我看到Receive Errors计数器在UDP Statistics for IPv4增量下;似乎Windows 8丢弃了数据包,因为有一个错误,而Wireshark接受了数据包(并没有说它有什么问题)。

tl; dr:即使Wireshark没有显示所述数据包有任何问题,可能导致Windows 8丢弃UDP数据包的原因是什么?

哦,如果有人说“你的UDP代码不起作用!”:应用程序正确地听到主NIC上的板卡响应;只有当我将一块板移动到连接到我的辅助NIC的路由器时,我的应用程序才会收到响应。

我还禁用了Windows防火墙来测试这是否是问题;它不是。

2 个答案:

答案 0 :(得分:1)

确实非常奇怪。关闭Windows防火墙显然没有关闭防火墙;我只需要手动将我的应用程序的规则从“块UDP”更改为“允许UDP”,现在一切正常。

答案 1 :(得分:0)

我知道回答这个问题已经很晚了。但如果有帮助,请告诉我。

请在广播模式下连续发送ARP回复包。如果网络中不存在ARP,则Windows堆栈中不存在数据包状态。你不需要像100毫秒那样在cetain延迟中发送arp请求。

我有完全相同的问题。在这种方法中它被纠正了。