共享UDP广播接收——python示例
我有一些数据的UDP广播。我能够在python 2.6.1中,在OSX 10.6.8下打开以下客户端,并且它可以正常工作。我能抓住数据,一切都很好 但是:这段代码“消耗”了端口,因为我无法打开另一个端口,第二次尝试绑定失败。。。我必须允许不止一个听众。以下是打开端口的代码:共享UDP广播接收——python示例,python,udp,broadcast,Python,Udp,Broadcast,我有一些数据的UDP广播。我能够在python 2.6.1中,在OSX 10.6.8下打开以下客户端,并且它可以正常工作。我能抓住数据,一切都很好 但是:这段代码“消耗”了端口,因为我无法打开另一个端口,第二次尝试绑定失败。。。我必须允许不止一个听众。以下是打开端口的代码: import select, socket port = 58083 # port msg is broadcast upon # Create listening port # --------------
import select, socket
port = 58083 # port msg is broadcast upon
# Create listening port
# ---------------------
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.bind(('', port))
except:
print 'failure to bind'
s.close()
raise
s.setblocking(0)
…由于UDP用于向多个客户端广播(除其他外),我认为我做错了什么。我就是不知道是什么
我在activestate上找到了一个示例,其中建议:
s.bind(('<broadcast>',port))
s.bind(('',端口))
…但这每次都失败了。绑定到0.0.0.0
是可行的,但也存在“一个客户端”的问题。绑定到本地IP(例如,192.168.1.100
)根本不起作用。移除绑定根本不起作用
有人吗?如果需要多个进程来侦听58083,则需要在
socket.bind()之前在socket上设置SO\u REUSEADDR
在底部添加了一个无限循环,并在我的linux服务器上运行了两次(一次作为root用户,另一次作为unpriv用户),我看到:
不工作:socket.error:[Errno 48]地址已在使用中
是的,我仍然没有看到以同一用户身份运行时出现问题,我不确定这是否会影响OS X。。。真是太好了old@fyngyrz您需要在所有要共享同一端口的套接字上设置该选项,而不仅仅是第二个和后续端口。对于后代来说,这个答案是正确的,只是OS X已损坏,无法正确处理广播。因此,我接受它,因为它是正确的,除了OS X用户。绑定到192.168.1.100会在启动第二个实例时返回“socket.error[Errno 48]Address ready in use”。删除与192.168.1.100的绑定将导致没有广播接收。删除以“”作为ip地址的绑定将导致无法接收。添加推荐行不会影响客户端1,但客户端2会报告错误,如下所述。使用广播作为字符串获取错误49无法分配请求的地址
import select, socket
port = 58083 # port msg is broadcast upon
# Create listening port
# ---------------------
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Allow other processes to
# bind to port
try:
s.bind(('0.0.0.0', port))
except:
print 'failure to bind'
s.close()
raise
s.setblocking(0)
root@tsunami# lsof | grep 58083
python 25908 root 3u IPv4 284835 0t0 UDP *:58083
python 25945 mpenning 3u IPv4 284850 0t0 UDP *:58083
root@tsunami#