Время ожидания сокета Python UDP на recv несмотря на ответ от конечной точки - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь написать код, который отправляет пакет SIP OPTIONS через UDP-сокет на устройство и получает ответ. Я проверил в Wireshark, что конечная точка получает мой пакет и отвечает соответствующим образом, однако сокет никогда не получает ответ, и установленное мной время ожидания встречается и вызывается как исключение.

Код:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.bind(('', _port))
client_socket.settimeout(10.0)
client_socket.connect((_destination_ip, _port))
_payload = ('OPTIONS sip:{0}:{1};transport=udp SIP/2.0\r\n'
    'Via: SIP/2.0/UDP {2}:{1};branch=1234\r\n'
    'From: \"{3}\"<sip:{3}@{2}:{1}>;tag=5678\r\n'
    'To: <sip:{0}:{1}>\r\n'
    'Call-ID: 9abcd\r\n'
    'CSeq: 1 OPTIONS\r\n'
    'Max-Forwards: 0\r\n'
    'Content-Length: 0\r\n\r\n').format(_destination_ip, _port, _source_ip, _host_name)


client_socket.send(bytes(_payload, "utf-8"))


try:
    data = client_socket.recv(2048)
    print('{0}').format(data)
except socket.timeout:
    print('Request timed out')
finally:
    client_socket.close()

Вот вывод Wireshark, подтверждающий, что моя конечная точка отвечает: выход Wireshark

Кроме того, я написал аналогичный тест с использованием Scapy и смог получить и отобразить ответ. В конечном итоге этот код будет запускаться как проверка на сервере Nagios, и я хотел бы использовать библиотеку сокетов по умолчанию, чтобы избежать необходимости устанавливать Scapy в качестве зависимости от всех работников Nagios, которые будут запускать это.

...