我正在尝试编写一些代码,该代码通过UDP套接字将SIP OPTIONS数据包发送到设备并接收响应。我已经在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 output
或者,我使用Scapy编写了类似的测试,并且能够接收和显示响应。该代码最终将作为对Nagios服务器的检查运行,并且我想使用默认的'socket'库,这样就可以避免将Scapy安装为将要运行此程序的所有Nagios工人的依赖项。