Слушайте трансляции в python 2, но не в python 3 - PullRequest
3 голосов
/ 13 февраля 2020

Я перенес свою кодовую базу с py2 на py3, но определенная c сетевая часть не работает.

Фрагмент прослушивает широковещательное сообщение с устройства (нет, это не ответ на что-то, устройство отправляет это примерно каждые 20 секунд)

Это прекрасно работает при python 2 , но в python 3 сообщение не перехватывается (сообщения об ошибке нет, просто время ожидания до указанных 30 секунд).

Я не нашел ничего в рекомендациях по переносимости, поэтому любой совет будет приветствуется.

Thx

# -*- coding: utf-8 -*-

import re
import sys
import socket
import struct


def discover():
    p = re.compile((r'AMXB<-UUID=GlobalCache_(?P<UUID>.{12}).+'
        r'Model=iTach(?P<Model>.+?)>.+'
        r'Revision=(?P<Revision>.+?)>.+'
        r'Config-URL=http://(?P<IP>.+?)>.+'
        r'PCB_PN=(?P<PN>.+?)>.+'
        r'Status=(?P<Status>.+?)>'))

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.settimeout(30)
    s.bind(('', 9131))

    group = socket.inet_aton('239.255.250.250')
    mreq = struct.pack('4sL', group, socket.INADDR_ANY)
    s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    while True:
        try:
            data = s.recv(1024)
            match = p.match(data)
            if match:
                print ("iTach found!")
                print ("IP:\t\t%s" % match.group('IP'))
                return
        except socket.timeout:
            print ("Could not find an iTach on the network")
        finally:
            s.close()
            return


discover()
exit(0)

...