在子网外发送udp消息

时间:2015-01-27 04:45:48

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

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

我的电脑已连接到局域网网络。自动接收此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))

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

1 个答案:

答案 0 :(得分:3)

实际上你应该使用" IP地址别名"在PC上的单个以太网端口上同时拥有192.168.2.1/255.255.255.0192.168.4.1/255.255.255.0


192.168.4.10发送UDP数据报到192.168.2.1/255.255.255.0时发生了什么:

  1. 您的电脑和目的地的网络地址不同:192.168.4.0 vs 192.168.2.0
  2. 因此,您的PC假设它必须要求网关路由器在远程的某处正确地传送数据报,并将其发送到路由器(有关如何执行此操作的详细信息并不重要)
  3. 我猜你的路由器对192.168.4.0网络一无所知,不得不丢弃数据报
  4. 192.168.4.10发送UDP数据报到192.168.2.1/255.255.0.0时发生了什么:

    1. 您的电脑和目的地的网络地址已商定: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. 您的电脑可以发送UDP数据报到d8:cb:8a:f0:0b:aa
      • 仅供参考:在您的PC可以与网关路由器通信之前,必须执行类似的过程。