看不到来自另一台设备的 UDP 多播消息
not seeing UDP multicast messages from another device
我有一台 Windows 机器,其中有两个脚本通过 UDP 多播发送和接收消息(在同一台机器上)。我有一个 C 和 Python3 的实现。 Python3 看起来像这样:
sender.py
import socket
MCAST_GRP = '239.1.1.1'
MCAST_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
print("Sending")
sock.sendto(bytearray("str()", "utf-8"), (MCAST_GRP, MCAST_PORT))
data, address = sock.recvfrom(1024)
print('received %s bytes from %s' % (len(data), address))
print(data)
receiver.py
import socket
import struct
import sys
multicast_group = '239.1.1.1'
server_address = ('', 1234)
# Create the socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind to the server address
sock.bind(server_address)
# Tell the operating system to add the socket to the multicast group
# on all interfaces.
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
# Receive/respond loop
while True:
print('\nwaiting to receive message')
data, address = sock.recvfrom(1024)
print('received %s bytes from %s' % (len(data), address))
print(data)
print('sending acknowledgement to', address)
sock.sendto(bytearray("ack", "utf-8"), address)
我有另一个物理设备连接到同一台机器,但我的程序无法从它接收任何消息。我可以看到 Wireshark 正在查看来自其他物理设备的消息,这些消息通过 eth0
接口到达相同的 IP 和端口。我知道我的脚本产生的流量在 VirtualBox Host-Only Network
上。我不确定这是否会导致我看不到来自外部设备的 UDP 多播消息的问题。
我也在 Linux 机器上测试过(最新的 kali 版本),但也无法从外部设备接收任何消息。
如果我遗漏了一些信息,请告诉我。
编辑 1:
我的设置如下:
我是 运行 原生 Windows 10 机。这台机器连接的设备是 运行 一些 OS 我不知道。我只能从它发送和接收消息。我可以通过我的 Windows 10 机器上的物理以太网端口发送以太网、TCP 和 IPv4 数据包,方法是指定我为此使用的软件以使用 eth0 和我分配给该端口的已定义 IP(v4) 地址网络适配器设置 (192.168.1.100)
这些脚本 运行 在同样连接到设备的 Windows 10 台机器上。他们在这个界面上发送 VirtualBox Host-Only Network
但我不知道为什么。我没有配置这样的东西。我认为接口应该不是问题,因为这就是 UDP 多播的工作方式(我不确定,所以如果我弄错了请告诉我!)
发件人的示例输出如下所示:
Sending
received 3 bytes from ('192.168.56.1', 3000)
b'ack'
Process finished with exit code 0
接收者:
waiting to receive message
received 5 bytes from ('192.168.56.1', 55132)
b'robot'
sending acknowledgement to ('192.168.56.1', 55132)
waiting to receive message
我希望澄清设置。如果仍然缺少信息,请告诉我!
如 https://www.tldp.org/HOWTO/Multicast-HOWTO-6.html 所述,套接字 API 要求您识别接口以及要使用的多播 address/port。
通过在您的示例代码中未指定它,您已将其留给 OS 来选择,它选择了一个 VirtualBox Host-Only 网络。不幸的是,这种类型的网络是 limited to VMs running on the Windows machines。
要修复它,您需要确定要用于多播的接口并将其传递给您的发送和接收代码。例如:
sender.py
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(MCAST_IF_IP))
receiver.py
mreq = struct.pack('4s4s', group, socket.inet_aton(MCAST_IF_IP))
其中 MCAST_IF_IP
是您要使用的接口的 IP 地址。
我有一台 Windows 机器,其中有两个脚本通过 UDP 多播发送和接收消息(在同一台机器上)。我有一个 C 和 Python3 的实现。 Python3 看起来像这样:
sender.py
import socket
MCAST_GRP = '239.1.1.1'
MCAST_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
print("Sending")
sock.sendto(bytearray("str()", "utf-8"), (MCAST_GRP, MCAST_PORT))
data, address = sock.recvfrom(1024)
print('received %s bytes from %s' % (len(data), address))
print(data)
receiver.py
import socket
import struct
import sys
multicast_group = '239.1.1.1'
server_address = ('', 1234)
# Create the socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind to the server address
sock.bind(server_address)
# Tell the operating system to add the socket to the multicast group
# on all interfaces.
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
# Receive/respond loop
while True:
print('\nwaiting to receive message')
data, address = sock.recvfrom(1024)
print('received %s bytes from %s' % (len(data), address))
print(data)
print('sending acknowledgement to', address)
sock.sendto(bytearray("ack", "utf-8"), address)
我有另一个物理设备连接到同一台机器,但我的程序无法从它接收任何消息。我可以看到 Wireshark 正在查看来自其他物理设备的消息,这些消息通过 eth0
接口到达相同的 IP 和端口。我知道我的脚本产生的流量在 VirtualBox Host-Only Network
上。我不确定这是否会导致我看不到来自外部设备的 UDP 多播消息的问题。
我也在 Linux 机器上测试过(最新的 kali 版本),但也无法从外部设备接收任何消息。
如果我遗漏了一些信息,请告诉我。
编辑 1:
我的设置如下: 我是 运行 原生 Windows 10 机。这台机器连接的设备是 运行 一些 OS 我不知道。我只能从它发送和接收消息。我可以通过我的 Windows 10 机器上的物理以太网端口发送以太网、TCP 和 IPv4 数据包,方法是指定我为此使用的软件以使用 eth0 和我分配给该端口的已定义 IP(v4) 地址网络适配器设置 (192.168.1.100)
这些脚本 运行 在同样连接到设备的 Windows 10 台机器上。他们在这个界面上发送 VirtualBox Host-Only Network
但我不知道为什么。我没有配置这样的东西。我认为接口应该不是问题,因为这就是 UDP 多播的工作方式(我不确定,所以如果我弄错了请告诉我!)
发件人的示例输出如下所示:
Sending
received 3 bytes from ('192.168.56.1', 3000)
b'ack'
Process finished with exit code 0
接收者:
waiting to receive message
received 5 bytes from ('192.168.56.1', 55132)
b'robot'
sending acknowledgement to ('192.168.56.1', 55132)
waiting to receive message
我希望澄清设置。如果仍然缺少信息,请告诉我!
如 https://www.tldp.org/HOWTO/Multicast-HOWTO-6.html 所述,套接字 API 要求您识别接口以及要使用的多播 address/port。
通过在您的示例代码中未指定它,您已将其留给 OS 来选择,它选择了一个 VirtualBox Host-Only 网络。不幸的是,这种类型的网络是 limited to VMs running on the Windows machines。
要修复它,您需要确定要用于多播的接口并将其传递给您的发送和接收代码。例如:
sender.pysock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(MCAST_IF_IP))
receiver.py
mreq = struct.pack('4s4s', group, socket.inet_aton(MCAST_IF_IP))
其中 MCAST_IF_IP
是您要使用的接口的 IP 地址。