在 Python 中接收广播数据包

Posted

技术标签:

【中文标题】在 Python 中接收广播数据包【英文标题】:Receiving Broadcast Packets in Python 【发布时间】:2014-05-17 16:49:55 【问题描述】:

我有以下代码发送在子网中广播的udp 数据包。

from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.sendto('this is testing',('255.255.255.255',12345))

以下代码用于接收广播包。

from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.bind(('172.30.102.141',12345))
m=s.recvfrom(1024)
print m[0]

问题是它没有收到任何广播数据包。但是,它成功地接收到发送到该端口的正常 udp 数据包。

我的机器显然正在接收广播数据包,我使用netcat 进行了测试。

$ netcat -lu -p 12345                                             
this is testing^C

那么,问题究竟出在哪里?

【问题讨论】:

您可能想检查您的 IP,因为我用我的 IP 尝试了您提供的方法,并且效果很好。而@John Zwinck 给出的答案也可以正常工作。 5 个八位字节的 IP 地址如何有效?怎么不出错? 【参考方案1】:

尝试绑定到默认地址:

s.bind(('',12345))

【讨论】:

我相信,引号之间必须有空格才能起作用。 ' ' 而不是 '' 确实有效!如果机器有多个 IP 地址怎么办? @nitish712:它将监听所有接口。 @JohnZwinck 但是如何做到这一点,在特定的界面上收听?我实际上不想要来自所有接口的数据包。 @nitish712 监听特定接口,你需要指定该接口的广播ip。这已在我对这个问题的回答中进行了概述。【参考方案2】:

我相信已接受答案中概述的解决方案可以解决问题,但方式并不完全正确。您不应该使用普通的接口 IP,而是用于发送消息的广播 IP。例如,如果 ifconfig 是:


inet 地址:10.0.2.2 广播:10.0.2.255 掩码:255.255.255.0
那么服务器应该使用 s.bind(('10.0.2.255',12345)),而不是 10.0.2.2(在 OP 的情况下,他应该使用 255.255.255.255)。 接受的答案有效的原因是,' ' 告诉服务器接受来自所有地址的数据包,同时指定 IP 地址,过滤它。' ' 是锤子,指定正确的广播地址是手术刀。在许多情况下,虽然可能不是 OP,但服务器只监听指定的 IP 地址很重要(例如,您只想接受来自私有网络的请求 - 上面的代码也可以接受来自任何外部网络的请求),以确保安全如果没有别的目的。

【讨论】:

如果您使用的是广播而不是多播,那么除了直接连接的第 2 层网络之外,您如何从其他任何地方获取广播?除非您的意思是您只想收听特定网络上的广播,例如 ***? @FilipHaglund 只要您在同一个第 3 层网络(子网)中,上述代码应该可以正常工作。基于 IP 的广播是网络层(第 3 层)功能,而不是链路层(第 2 层)。如果您希望从任何连接的接口接收广播数据包,则接受的答案应该没问题。澄清你的问题可能有助于我更好地回答你。 @AbrahamPhilip 说如果想在连接到同一个 wifi 的我的 android 设备上发现这个广播(或连接到 android 设备热点的 PC),这可能吗?我知道这不是特定于 python 的。 @PhaniRithvij 是的,同样的原理应该适用于 Android 或 PC 程序,您只需要使用您使用的任何语言创建一个 UDP 侦听套接字并将其设置为侦听任何广播地址您的 Wi-Fi 网络是。 如何通过Python的socket模块获取广播地址?【参考方案3】:
s=socket(AF_INET, SOCK_DGRAM)
s.bind(('',1234))
while(1):
    m=s.recvfrom(4096)
    print 'len(m)='+str(len(m))
    print 'len(m[0])='+str(len(m[0]))    
    print m[0]

    print 'len(m[1])='+str(len(m[1]))    
    print m[1]  

【讨论】:

只用代码回答不是一个好的解决方案。阅读此how-to-ask 以遵循 SO 指南。

以上是关于在 Python 中接收广播数据包的主要内容,如果未能解决你的问题,请参考以下文章

在 Pixel 2 和 Pixel 2 XL 接收 UDP 广播数据包

洪泛和广播的区别

监听特定端口时接收广播数据包

udp为啥收不到广播中的数据,该怎么处理

读<Wireshark数据包分析实战-第3版;之流量分类

多进程UDP广播包绑定到一个网卡