用Python接收广播数据包

用Python接收广播数据包,python,sockets,udp,broadcast,Python,Sockets,Udp,Broadcast,我有以下代码,它发送一个在子网中广播的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(('17

我有以下代码,它发送一个在子网中广播的
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

那么,问题到底在哪里

尝试绑定到默认地址:

s.bind(('',12345))

我相信在被接受的答案中列出的解决方案解决了这个问题,但不是以完全正确的方式。您不应该使用普通的接口IP,而是用于发送消息的广播IP。例如,如果ifconfig为:
inet addr:10.0.2.2 Bcast:10.0.2.255掩码:255.255.255.0
那么服务器应该使用 s、 绑定('10.0.2.255',12345)),而不是10.0.2.2(在OP的情况下,他应该使用255.255.255.255)。
接受的答案之所以有效,是因为“”告诉服务器接受来自所有地址的数据包,同时指定IP地址,对其进行过滤。

是锤子,指定正确的广播地址是手术刀。在许多情况下,虽然可能不是OP,但出于安全目的(如果没有其他原因),服务器只侦听指定的IP地址(例如,您希望只接受来自专用网络的请求-上述代码也会接受来自任何外部网络的请求)是很重要的。

我相信,引号之间必须留有空格,才能正常工作<代码>'而不是真正有效的
'
!如果机器有多个ip地址怎么办?@nitish712:它将侦听所有接口。@JohnZwinck但如何做到这一点,侦听特定接口?实际上,我不希望来自所有接口的数据包。@nitish712要在特定接口上侦听,需要指定该接口的广播ip。这已经在我对这个问题的回答中进行了概述。你可能想要检查你的IP,因为我尝试了你提供的方法,并且我的IP非常有效。虽然@John Zwinck给出的答案也很好,但是一个有5个八位字节的ip地址如何有效?如果您使用的是广播而不是多播,那么除了直接连接的第2层网络之外,您如何从其他任何地方获得广播?除非您的意思是只想在特定网络(如vpn?@FilipHaglund)上收听广播,否则只要您在同一第3层网络(子网)中,上述代码就可以正常工作。基于IP的广播是网络层(第3层)功能,而不是链路层(第2层)。如果您希望从任何连接的接口接收广播数据包,则接受的答案应该是可以的。澄清您的问题可能有助于我更好地回答您。@AbrahamPhilip说,如果要在连接到同一wifi的android设备(或连接到android设备热点的PC)上发现此广播,是否可能?我知道这不是python特有的。@PhaniRithvij是的,同样的原理应该适用于Android或PC程序,你只需要用你正在使用的任何一种语言制作一个UDP侦听套接字,并将其设置为在Wi-Fi网络的广播地址上侦听。如何通过Python的套接字模块获取广播地址?仅用代码回答不是一个好的解决方案。阅读此内容以遵循SO指南。
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]