Я пытаюсь написать код, который отправляет пакет 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, которые будут запускать это.