当前位置:  开发笔记 > 编程语言 > 正文

在Python中接收广播包

如何解决《在Python中接收广播包》经验,为你挑选了2个好方法。

我有以下代码发送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

那么问题究竟在哪里呢?



1> John Zwinck..:

尝试绑定到默认地址:

s.bind(('',12345))


@ nitish712要监听特定的接口,需要指定该接口的__broadcast ip__.我在回答这个问题时已经概述了这一点.

2> Abraham Phil..:

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


inet addr:10.0.2.2 Bcast: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地址(例如,您只想接受来自专用网络的请求 - 以上代码也会接受来自任何外部网络的请求),以确保安全性没有别的目的.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有