首页 文章

没有看到来自其他设备的UDP多播消息

提问于
浏览
1

我有一台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版本)但是也无法从外部设备接收任何消息 .

如果我遗漏了一些信息,请告诉我 .

EDIT 1:

我的设置如下:我正在运行本机Windows 10计算机 . 这台机器是连接的设备,运行一些我不知道的操作系统 . 我只能发送和接收来自它的消息 . 我可以通过指定我用来使用eth0的软件和我在网络适配器设置中分配给该端口的已定义IP(v4)地址,通过Windows 10计算机上的物理以太网端口发送以太网,TCP和IPv4数据包(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

我希望澄清设置 . 如果仍有信息丢失,请告诉我!

1 回答

  • 2

    https://www.tldp.org/HOWTO/Multicast-HOWTO-6.html所述,套接字API要求您标识接口以及要使用的多播地址/端口 .

    如果未在示例代码中指定此内容,则将其留给操作系统进行选择,并选择了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地址 .

相关问题