我有一个带有两个以太网适配器的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防火墙来测试这是否是问题;它不是。
答案 0 :(得分:1)
答案 1 :(得分:0)
我知道回答这个问题已经很晚了。但如果有帮助,请告诉我。
请在广播模式下连续发送ARP回复包。如果网络中不存在ARP,则Windows堆栈中不存在数据包状态。你不需要像100毫秒那样在cetain延迟中发送arp请求。
我有完全相同的问题。在这种方法中它被纠正了。