не видит многоадресные UDP-сообщения от другого устройства - PullRequest
0 голосов
/ 22 мая 2018

У меня есть компьютер с 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)

receive.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.К этой машине подключено устройство под управлением какой-то ОС, которую я не знаю.Я могу только отправлять и получать сообщения от него.Я могу отправлять пакеты Ethernet, TCP и IPv4 через физический порт Ethernet на моем компьютере с Windows 10, указав программное обеспечение, которое я использую для этого, для использования eth0 и определенного IP-адреса (v4), который я назначил этому порту в настройках сетевого адаптера.(192.168.1.100)

Сценарии выполняются на том же компьютере с Windows 10, который также подключен к устройству.Они отправляют по этому интерфейсу VirtualBox Host-Only Network, но я не знаю почему.Я не настраивал ничего подобного.Я предполагаю, что интерфейс не должен быть проблемой, потому что именно так работает UDP Multicast (я не уверен в этом, поэтому, если я ошибаюсь, пожалуйста, дайте мне знать!)

Пример выходных данных отправителя выглядит следующим образом:

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 Ответ

0 голосов
/ 30 мая 2018

Как указано в https://www.tldp.org/HOWTO/Multicast-HOWTO-6.html, API сокетов, требуется, чтобы вы идентифицировали интерфейс, а также адрес / порт многоадресной рассылки, который вы хотите использовать.

Не указав это в своем примере кода, вы оставили его на выбор ОС, и она выбрала VirtualBox Host-Only Network.К сожалению, этот тип сети ограничен виртуальными машинами, работающими на машинах с Windows .

. Чтобы исправить это, вам нужно определить интерфейс, который вы хотите использовать для многоадресной рассылки, и передать его вВаш код отправки и получения.Например:

sender.py
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(MCAST_IF_IP))
receive.py
mreq = struct.pack('4s4s', group, socket.inet_aton(MCAST_IF_IP))

, где MCAST_IF_IP - это IP-адрес интерфейса, который вы хотите использовать.

...