C语言 UDP包是Wireshark抓取的,不是Application



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

问题是,在Windows 8中(可能在旧版本中也是如此),发送广播到255.255.255.255实际上只选择主网络适配器,但我的应用程序必须向我的计算机上的每个网络适配器发送广播。我硬编码了一个广播到我的第二个(非主要)网卡的IP地址169.254.66.143(网络掩码为255.255.0.0),所以应用程序广播到169.254.255.255,以确定是否有任何板在第二个网卡的网络上。

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

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

tl;dr:什么可能导致Windows 8丢弃UDP数据包,即使Wireshark没有显示该数据包有任何错误?

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

我还禁用了Windows防火墙来测试是否存在这个问题;

确实很奇怪。关闭Windows防火墙显然不会关闭防火墙;我只需要手动更改我的应用程序的规则,从"阻止UDP"到"允许UDP",现在一切都很好。

我知道现在回答这个问题有点晚了,但如果有帮助,请让我知道。

请以广播方式连续发送ARP应答报文。如果ARP不存在于网络中,我们的数据包状态不存在于windows堆栈中。你不需要发送arp请求在一定的延迟,如100ms。

我有完全相同的问题。用这种方法进行了修正。

相关内容

最新更新