我正在尝试使用Python的套接字库将UDP广播数据包发送到网络,然后接收UDP响应。我正在使用Windows 7,Python 3.5.2。
我已将程序简化为以下代码,其中有两种配置:
from socket import socket, AF_INET, SOCK_DGRAM
packet = b'\x00\x01\x00\x10'
sock = socket(AF_INET, SOCK_DGRAM) # Interet, UDP
sock.bind(('192.168.1.15', 1001)) # IP of local PC. Must bind to use the correct interface as multiple interfaces are present.
# CONFIGURATION 1: BROADCAST - ONLY TRANSMITTED PACKET IS RECEIVED
sock.sendto(packet, ('192.168.1.255', 1001)) # Broadcast on local interface
# CONFIGURATION 2: DIRECT TO TARGET - RESPONSE IS RECEIVED
sock.sendto(packet, ('192.168.1.70', 1001)) # Direct to target
while True:
data, addr = sock.recvfrom(1024)
print(str(addr) + ': ' + str(data))
在配置1中,Wireshark指示从192.168.1.15到192.168.1.255在端口1001上发送了4个字节的UDP请求,并且从192.168.1.70在端口1001上的30个字节的目标生成了响应(目标IP)到192.168.1.15(运行脚本的PC的IP)。但是,脚本不会收到此响应,而只会显示其请求的内容:
('192.168.1.15', 1001): b'\x00\x01\x00\x10'
在Configuraton 2中,Wireshark指示从192.168.1.15到192.168.1.70(目标的IP)在端口1001上发送了4字节的UDP请求,并且目标在端口上生成了30个字节的响应从192.168.1.70到192.168.1.15(运行脚本的PC的IP)的1001。该脚本确实收到此响应,并打印它:
('192.168.1.70', 1001): b'\x00\x02ABCDEFGH\x00ZYXWV\x000\x00ZYXWV\x00ABC\x00\x10'
我尝试设置SO_BROADCAST选项setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
,但观察到相同的结果。
我尝试设置SO_REUSEADDR选项setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
,但观察到相同的结果。
我想念什么?感谢您的帮助。