我有一些数据的UDP广播。我可以在OSX 10.6.8下的python 2.6.1中打开以下客户端,它可以工作。我可以抓住数据,一切都很好。
但是:这段代码“消耗”了端口,因为我无法打开另一个端口,第二次绑定尝试失败了......我必须允许不止一个监听器。这是打开端口的代码:
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))
......但每次都失败了。绑定到0.0.0.0
有效,但也遇到“一个客户端”问题。绑定到本地IP(例如192.168.1.100
)根本不起作用。删除绑定根本不起作用。
任何?
答案 0 :(得分:2)
如果你需要多个进程来监听58083,你需要在SO_REUSEADDR
之前在套接字上设置socket.bind()
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)
在底部添加一个无限循环,并在我的linux服务器上运行两次(一次作为root用户,另一次作为unpriv用户),我看到:
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#