【问题标题】:UDP Packets not Sending Possibly Due to Client Not Found?由于找不到客户端,可能导致 UDP 数据包未发送?
【发布时间】: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


【解决方案1】:

谢谢@Remy:改为手动创建自己的 ARP 记录。 ——雷米·勒博

我没有意识到我可以在 ARP 中创建手动条目。我需要阅读有关 ARP 的更多信息。添加手动条目解决了我的问题。我发现你可以使用 ASP -s 来完成,或者使用 NETSH 添加邻居。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多