Python套接字:广播后未收到UDP响应

时间:2019-07-16 18:09:16

标签: python sockets networking udp

我正在尝试使用Python的套接字库将UDP广播数据包发送到网络,然后接收UDP响应。我正在使用Windows 7,Python 3.5.2。

我已将程序简化为以下代码,其中有两种配置:

  • 配置1是我正在尝试实现的广播消息,它与目标IP无关,并且希望从目标接收响应以进行标识。在此配置中未收到响应。
  • 配置2是我在调试中发现的,在调试中,将消息直接发送到目标并接收响应。这并不是非常有用,因为我需要知道目标的IP,但是它证明了如果不针对地址,代码段可以发送和接收。
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),但观察到相同的结果。

我想念什么?感谢您的帮助。

0 个答案:

没有答案