是否可以通过wifi发送UDP广播而无需连接到网络?

时间:2015-07-17 02:51:53

标签: python sockets udp wifi broadcast

我正在尝试获取设置为接入点的2个Raspberry pis之间的数据包的飞行时间。

现在,只要它们连接到同一网络,我就可以在它们之间传输广播。

我的想法是,我可以在没有连接到网络的情况下发送UDP广播,类似于信标数据包和探测请求的发送方式。

这是我的服务器代码,我使用wireshark在另一端接收数据包。

import sys, time
import socket, IN

port = 22222
interface = "wlan0"
broadcast = "255.255.255.255"

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, interface + "\0")

while 1:
    s.sendto("test data", (broadcast, port))
    time.sleep(2)

有人知道这是否可行?在正确的方向上的一点将不胜感激:)

1 个答案:

答案 0 :(得分:4)

当设备未连接到网络时,无法发送/接收UDP / IP数据包。 IP层要求链路层连接。

信标数据包和探测请求不需要连接网络,但它们不是IP数据包(它们根本没有IP头),因此无法通过AF_INET套接字构造和发送它们。可以创建wifi上的原始数据包并通过原始套接字发送。但是,如果您尝试手动构建带有IP和UDP标头的数据包并将其发送到网络,则没有人会响应它,因为发件人未连接到网络。

python库https://github.com/kbandla/python-wifitools支持构建原始802.11消息,如信标数据包,但如果节点未连接,您将永远不会发送有效的UDP / IP数据包。