【发布时间】:2019-07-08 21:28:06
【问题描述】:
我有一个非常简单的应用程序。它向网络上其他地方的客户端发送 UDP 数据包。
主机为 192.168.11.66(Windows 10),客户端设备为 192.168.11.65(专有设备)。
主机 pc 看不到客户端设备,但我知道它已打开并正在监听流量。当我从主机发送 UDP 数据包时,我使用 Wireshark,但没有看到数据包被发送出去。相反,我看到来自 ARP 的消息试图定位客户端。我假设由于 ARP 不成功,主机取消了数据包的发送。
如果我将数据包的目标地址更改为广播地址,则所有数据包都会被发送,并且我可以在 Wireshark 上看到所有内容。我需要能够指定客户端的 IP 地址并让 Windows 发送数据包,无论它是否认为客户端设备在网络上。客户端设备寻找专门针对自己的 UDP 流量,而客户端设备无法让自己在网络上可见。
有人知道如何解决这个问题吗?
【问题讨论】:
-
如果您将
connect()发送套接字到设备的IP,然后使用send()而不是sendto()发送数据包,您是否看到相同的ARP 不发送数据包行为?我以前从未听说过 UDP 套接字拒绝向 IP 发送数据包。 UDP是无连接的。通常,如果您尝试将数据包发送到不存在的目的地,它将出去,然后您将从网络返回一个 ICMP 错误数据包(Windows 通常不会将其传递给应用程序,除非 UDP 套接字是 @987654327 @ed)。至少,这是我使用 UDP 的经验。 -
显然这个 ARP 行为是 documented(参见“ARP 和 UDP 消息”部分)。它说使用
SendARP()在本地计算机上创建 ARP 记录,但该文档说只有在 ARP 请求成功时才会发生。尝试使用CreateIpNetEntry()手动创建自己的 ARP 记录。 -
您需要目标的第 2 层地址才能将第 2 层帧构建到目标。 ARP 将第 3 层地址解析为第 2 层地址,以便为第 2 层帧获取第 2 层地址。广播之所以有效,是因为它使用第 2 层广播地址,该地址到达第 2 层网络上的所有主机。您的主机必须知道目标第 2 层地址,然后才能构建到目标的第 2 层帧。
-
雷米 - 谢谢。我能够使用您的评论并将手动条目添加到 ARP 中。我能够使用 NETSH 并添加邻居。两者都有效。谢谢您的意见。我不知道如何将您的 cmets 标记为答案。
-
这是一个特定于以太网的应用程序吗?如果有,发送方是否知道接收方的以太网硬件地址?
标签: windows sockets networking tcp udp