共享UDP广播接收——python示例

fyn*_*yrz 5 python udp broadcast

我有一些数据的 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)
Run Code Online (Sandbox Code Playgroud)

...由于 UDP旨在向多个客户端广播(除其他外),我认为我做错了什么。我就是想不通是什么。

我在 activestate 上找到了一个示例,该示例建议:

s.bind(('<broadcast>',port))
Run Code Online (Sandbox Code Playgroud)

...但每次都失败了。绑定到0.0.0.0作品,但也遭受“一个客户端”的问题。绑定到本地 IP(例如192.168.1.100)根本不起作用。删除绑定根本不起作用。

任何人?

Mik*_*ton 3

如果需要多个进程监听58083,需要SO_REUSEADDR之前在socket上进行设置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)
Run Code Online (Sandbox Code Playgroud)

在底部添加无限循环并在我的 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#
Run Code Online (Sandbox Code Playgroud)

  • @fyngyrz,您需要在要共享同一端口的*所有*套接字上设置该选项,而不仅仅是第二个和后续端口。 (3认同)
  • 对于后代来说,这个答案是正确的,除了 OS X 已损坏且无法正确处理广播。因此我接受它,因为除了 OS X 用户之外它是正确的。 (3认同)