Не удается прочитать ответ от многоадресной рассылки udp в python - PullRequest
0 голосов
/ 01 июля 2019

Не получается прочитать ответ, отправленный мне после отправки многоадресной рассылки.tcpdump показывает, что отправляются как исходная многоадресная передача, так и ответ.Может кто-нибудь подсказать, что не так со следующей программой на python?Моя цель - передать обнаружение и затем прочитать ответ (который, как вы можете видеть из tcpdump ниже), НЕ отправляется обратно как многоадресная, а отправляется точка-точка на порт отправки.

#!/usr/bin/env python

from socket import socket, AF_INET, SOCK_DGRAM, IPPROTO_UDP
from textwrap import dedent
from soco.utils import really_utf8

PLAYER_SEARCH = dedent("""\
    M-SEARCH * HTTP/1.1
    HOST: 239.255.255.250:1900
    MAN: "ssdp:discover"
    MX: 1
    ST: urn:schemas-upnp-org:device:ZonePlayer:1
    """).encode('utf-8')
MCAST_GRP = '239.255.255.250'
MCAST_PORT = 1900

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
sock.sendto(really_utf8(PLAYER_SEARCH), (MCAST_GRP, MCAST_PORT))
print(sock)

data, addr = sock.recvfrom(1024, 0)     # hangs here forever
if data:
    print("Found Broadcast server at : ", addr)
    print(data)

Вывод на консоль выглядит следующим образом:

$ python simplesock.py
<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=17, laddr=('0.0.0.0', 40690)>

Программа зависает после печати sock в ожидании ввода.

Это tcpdump, который я получаю при запуске вышеуказанной программы,Обратите внимание, что сервер отвечает на порт, указанный выше в выводе консоли, поэтому сервер определенно получает мое исходное сообщение.

21:27:36.864212 IP (tos 0x0, ttl 1, id 41099, offset 0, flags [DF], proto UDP (17), length 147)
    ThinkPad-T480s.fios-router.home.40690 > 239.255.255.250.1900: UDP, length 119
E.....@...&m...........l....M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:schemas-upnp-org:device:ZonePlayer:1

21:27:37.361046 IP (tos 0x0, ttl 64, id 25095, offset 0, flags [DF], proto UDP (17), length 524)
    SonosZP.fios-router.home.34982 > ThinkPad-T480s.fios-router.home.40690: UDP, length 496
E...b.@.@.R...............Z.HTTP/1.1 200 OK
CACHE-CONTROL: max-age = 1800
EXT:
LOCATION: http://192.168.1.195:1400/xml/device_description.xml
SERVER: Linux UPnP/1.0 Sonos/50.1-65071 (ZPS12)
ST: urn:schemas-upnp-org:device:ZonePlayer:1
USN: uuid:RINCON_347E5CC2374C01400::urn:schemas-upnp-org:device:ZonePlayer:1
X-RINCON-HOUSEHOLD: Sonos_xxxUTzAZjabcDsaBadOOK2GQFP
X-RINCON-BOOTSEQ: 2
X-RINCON-WIFIMODE: 1
X-RINCON-VARIANT: 2
HOUSEHOLD.SMARTSPEAKER.AUDIO: Sonos_xxxUTzAZjabcDsaBadOOK2GQFP.RmcmkwBQ12BxWPa_fNdS

Python 3.6.7, работающий в Ubuntu 18.04.2 LTS

...