【问题标题】:Send udp message outside of subnet在子网外发送 udp 消息
【发布时间】:2015-03-25 15:37:40
【问题描述】:

我正在尝试与实现基本 UDP 协议的 FPGA 板通信。我使用的是 Windows 7 PC,python 2.7.6 32 位。

我的电脑已连接到 LAN 网络。自动接收此 IP(来自 ipconfig):IP 192.168.2.1,子网掩码:255.255.255.0

我的开发板通过开关连接到我的计算机。板子的 IP 是固定的(在硬件代码中) - 192.168.4.10。

如果我理解正确的话——我的电脑和主板位于不同的子网上,因为 4 个正确的 ip 子编号中有 2 个不同。

当我发送 UDP 数据包时 - 卡没有收到它。当我手动强制我的计算机使用相同的 ip (192.168.2.1) 但子网掩码为 255.255.0.0 时,它确实收到了。

我用来发送的python代码是这样的:

import socket

UDP_IP = "192.168.4.10"
RECEIVE_PORT = 5005
SEND_PORT = 5005
MESSAGE = "Hello, World!"

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock .bind(('', SEND_PORT))
sock.sendto(MESSAGE, (UDP_IP, RECEIVE_PORT))

可能是什么原因? 有什么办法可以在代码中解决这个问题吗? 有什么办法可以在代码中更改我的子网掩码? 我应该阅读什么来理解我的问题?

【问题讨论】:

    标签: network-programming udp ip ip-address subnet


    【解决方案1】:

    实际上,您应该使用“IP 地址别名”将192.168.2.1/255.255.255.0192.168.4.1/255.255.255.0 都放在 PC 上的单个以太网端口上:


    当您从192.168.2.1/255.255.255.0192.168.4.10 发送UDP 数据报时发生了什么:

    1. 您的 PC 和目标的网络地址不同:192.168.4.0 vs 192.168.2.0
    2. 因此,您的 PC 假定它必须要求网关路由器将数据报适当地传送到远程某处,并将其发送到路由器(有关如何执行此操作的详细信息在这里无关紧要)
    3. 我猜你的路由器对192.168.4.0网络一无所知,不得不丢弃数据报

    当您从192.168.2.1/255.255.0.0192.168.4.10 发送UDP 数据报时发生了什么:

    1. 您PC的网络地址和目的地一致:192.168.0.0
    2. 因此您的 PC 认为它不必打扰网关路由器,可以直接与它通信
    3. 然后下一步是通过 ARP(地址解析协议)查询接收者的 MAC 地址。它只是使用以太网广播来询问所有连接到您的 LAN 的设备谁是 192.168.4.10 的所有者
    4. 由于 ARP/以太网中没有子网的概念,您的 FPGA 网卡只是简单地回答“是的,我有 192.168.4.10。请拨打 d8:cb:8a:f0:0b:aa 联系我”
    5. 您的 PC 可以将 UDP 数据报发送到 d8:cb:8a:f0:0b:aa
      • 仅供参考:在您的 PC 可以与网关路由器通信之前,一定已经发生了类似的过程。

    【讨论】:

    • 如果幸运的话,您的远程设备也在侦听 UDP 多播或广播,您可以通过这种方式获取数据包。如果您也在收听 UDP 多播/广播,您可能会得到答复。但仅当远程设备知道通过多播/广播 UDP 响应您的机器时。如果您坚持使用 UDP 单播,那么 @nodakai 给出的就是唯一的 - 为您的 NIC 添加一个别名(如果可以的话)。
    • PS:以编程方式添加别名并非易事。 (1) 成为管理员,(2) 强制网卡为静态 IP 地址(如果当前是 DHCP),(3) 添加别名。没有独立于操作系统的方法来完成这一切。而且我对 python 网络的了解不够好,无法提出建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2013-11-05
    • 2016-10-16
    • 1970-01-01
    • 2014-10-22
    • 2012-06-05
    相关资源
    最近更新 更多