Python socket.recv висит - PullRequest
       28

Python socket.recv висит

0 голосов
/ 26 июня 2019

Я пытаюсь получить данные из ПЛК (AutomationDirect P2000).Я настроил ПЛК в качестве сервера с их программным обеспечением (я также могу подключиться к нему с помощью их программного обеспечения через Ethernet и использовать Wireshark, чтобы убедиться, что он фактически отправляет пакеты UDP на мою машину примерно каждые 200 мс).Я пытаюсь настроить очень простой скрипт Python для извлечения указанных данных, не потрудившись кодировать их или что-то с ними сделать, но моя программа зависает в socket.recv ().Всякий раз, когда я пытаюсь запустить его, «Got here» будет напечатано, но «Now here» не будет.Из того, что я прочитал, тот факт, что он зависает, означает, что данные не принимаются, но из моего (ограниченного) понимания того, что я вижу на Wireshark, это не так.Я довольно новичок во всем этом и был бы признателен за любую помощь.

Я попытался использовать socket.recvfrom (), который дает тот же результат.Я также попытался использовать socket.bind () вместо socket.connect (), но получаю исключение «Запрошенный адрес недопустим в его контексте».Кроме того, я попытался поиграться с различными IP-адресами и портами.Например, я попытался использовать IP = '' вместо фактического IP, и я попытался использовать информацию об источнике / месте назначения из Wireshark как то, что я пытаюсь связать или подключиться, но пока ничего не помогло.

import socket

IP = '192.168.3.1'
PORT = 9999
BUFFER_SIZE = 4096

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((IP, PORT))

while True:
    print("Got here")
    data = s.recv(BUFFER_SIZE)
    print("Now here")
    print(f"Received {data}")

Я ожидаю получить распечатку пакета в байтовом формате, но вместо этого программа зависает.Если я пытаюсь использовать socket.bind () вместо socket.connect (), я получаю сообщение об ошибке «... строка 8, в s.bind ((IP, PORT))

OSError: [WinError 10049] Запрошенный адрес недопустим в своем контексте "

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Проблема была в том, как я настроил ПЛК в качестве сервера.Данные UDP, которые я видел на порту 9999, не были связью, о которой я думал, а были только неотъемлемой связью между ПЛК и сетью через его проприетарную программу.Для любого любопытного я использую P2000 PLC от AutomationDirect и первоначально я настроил его как адаптер EtherNet / IP после одного из их видео, но мне пришлось использовать функциональность Custom Protocol over Ethernet, предоставленную в разделе «Связь».

0 голосов
/ 26 июня 2019

вы не можете использовать bind, как это, потому что IP-адрес не принадлежит вашему ПК.

когда вы connect на сервер, он (сервер) ничего не отправляет, но вы пытаетесь получить данные с сервера, поэтому сокет ожидает, пока не получит данные, и только тогда он продолжит выполнение. (это называется блокирующей функцией, поскольку она блокирует выполнение до его завершения).

...