【问题标题】:Send UDP packet, not using ARP, known IP and MAC发送 UDP 数据包,不使用 ARP,已知 IP 和 MAC
【发布时间】:2017-06-16 17:03:09
【问题描述】:

我正在尝试通过网络将 UDP 发送到微控制器。微控制器已经剥离了几乎所有的 IP 堆栈以保持精简,因此无法参与 ARP。 微控制器正在输出广播数据包,我可以接收到它,所以我知道它的 IP 地址和 MAC 地址。 我可以向它发送广播UDP数据包,它接收良好,但是当我尝试使用它的IP地址发送数据包时,我可以在wireshark中看到ARP消息,“谁有192.168.1.205?告诉192.168.1.18”,205是微,18是我的电脑。微不响应它的 MAC 地址,所以我不能发送数据包,但我知道微发送的数据包的 MAC 地址。

所以我的问题是我可以使用 UdpClient 指定 IP 和 MAC 地址,这样它就不需要使用 ARP.. 还有什么我不考虑的吗?

有效的广播方法如下所示:

myUdpClient.EnableBroadcast = true;
myUdpClient.Connect(IPAddress.Broadcast, port);
myUdpClient.Send(dataBytes, dataBytes.Length);

目前不起作用的固定IP方法是这样的

IPEndPoint ep = new IPEndPoint("192.168.1.205", port);
myUdpClient.Send(dataBytes, dataBytes.Length, ep);

我看过使用类似的东西

myUdpClient.Client.SendTo(dataBytes, SocketFlags.DontRoute, ep);

但这不起作用,并且仍然没有使用微控制器 MAC 地址。我的应用程序知道并需要使用(我认为)。我还希望网络上的某些 ARP 表能够知道 MAC 地址在哪里看到,因为带有此信息的数据包正在从它发送..

作为说明,我想将广播保持在最低限度,以减少网络上其他微控制器的负载。

提前致谢, 加雷斯

【问题讨论】:

  • 内置网络类根本不会友好地发送到不合规的目标。

标签: c# udp ip ethernet osi


【解决方案1】:

据我所知,你有两个选择,我相信其他人有更多;

  • 在启动应用程序之前在操作系统中设置静态 ARP 条目。 arp -s 或类似命令将在大多数操作系统上设置它并绕过 ARP 以进一步请求 IP。

  • 使用 Jpcap 完全绕过 IP 堆栈,构建和发送您自己的原始数据包。

【讨论】:

  • 您好,非常感谢 Joachim,使用 arp 命令停止了以太网上的 ARP 请求 :)... 现在我遇到的问题是 IP 标头的校验和错误...它的 0x0000,但是应该是 0x4e19,不确定这是否相关
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多