Я действительно изо всех сил пытаюсь получить широковещательные пакеты UDP в моем приложении Python, и я не до конца понимаю, почему. Я использую Python 2.7.15+ на Ubuntu 18.04, если это имеет значение.
У меня есть датчик Ethernet, который выдает сообщения о состоянии с интервалом 1 Гц по широковещательному адресу (255.255.255.255)
на порту 45000
.
Этот датчик подключен к адаптеру USB-Ethernet, опять же, если это что-то изменит - я не уверен.
Используя Wireshark, я вижу, что эти сообщения приходят с типичным интервалом, и (используя специальный декодер Lua) я вижу, что эти сообщения действительны.
Мой код класса Python выглядит следующим образом:
def startListening(self):
print("listening")
# Create the UDP socket
self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.udpSocket.bind(('',45000))
self.udpSocket.setblocking(0)
print(self.udpSocket.getsockname())
# prints ('0.0.0.0', 45000)
self.running = True
self.thread = threading.Thread(target=self.datagramPoll,args=(self.udpSocket,))
self.thread.start()
sleep(1)
def stopListening(self):
self.running = False
self.thread.join()
self.udpSocket.close()
def datagramPoll(self,sock):
while self.running:
try:
print("loop")
# Anything to read
data,addr = sock.recvfrom(1024)
print(data)
except socket.error, e:
print(e)
pass
sleep(1)
Я обнаружил, что всегда получаю исключение [Errno 11] Resource temporarily unavailable
, которое, как я понимаю, EWOULDBLOCK
, поскольку нет данных для чтения из сокета.
У меня есть эквивалентный код в Qt / C ++, который работает абсолютно нормально. Я проверил ufw
и включил соответствующие порты, но все равно ничего не получаю.