【问题标题】:Can't receive UDP broadcast in python无法在python中接收UDP广播
【发布时间】:2016-03-01 13:55:40
【问题描述】:

这里是广播服务器

from time import sleep
from socket import *

PORT = 50000
s = socket(AF_INET, SOCK_DGRAM)
s.bind(('', 0))
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)

data = "I am server"
while 1:
    s.sendto(data, ('<broadcast>', PORT))
    print "sent data"
    sleep(5)

请注意,您需要将'&lt;broadcast&gt;' 更改为您网络的实际广播地址。请看Python can't send a broadcast package with address

这里是广播接收器

from socket import socket, AF_INET, SOCK_DGRAM
PORT = 50000
client = socket(AF_INET, SOCK_DGRAM)
client.bind(('0.0.0.0', PORT))
data, addr = s.recvfrom(1024) #sticks here forever!

if data:
    print "Found Broadcast server at : " + addr

但问题是我的接收器只停留在s.recvfrom(1024) 虽然通过 tcpdump 我可以看到数据包,但为什么这个 python 客户端无法捕获它? 命令是sudo tcpdump -i wlan0 ip -X dst host 255.255.255.255

【问题讨论】:

    标签: python sockets network-programming broadcast


    【解决方案1】:

    我将您的代码更改为 Python 3 并更正了 2 个错误:

    • s 更改为client
    • 仅当有来自recvfrom() 的数据时才打印该语句

    希望对你有帮助。

    from socket import socket, AF_INET, SOCK_DGRAM
    PORT = 50000
    client = socket(AF_INET, SOCK_DGRAM)
    client.bind(('0.0.0.0', PORT))
    
    while True:
      data, addr = client.recvfrom(1024) #sticks here forever!
      if data:
        print("Found Broadcast server at : ", addr)
    

    【讨论】:

      【解决方案2】:

      绑定前需要设置socket选项,并且需要绑定到INADDR_BROADCAST。

      【讨论】:

      • @AbhishekSingh,我不会为你写代码。我相信,我的建议很明确。
      • 至少告诉我需要为套接字设置哪些选项,对于服务器,我已经设置了套接字选项
      • @AbhishekSingh,同样 - SO_BROADCAST。
      • 我认为这个建议并不明确,事实上,IPv4(python2 套接字)的建议方法似乎是使用 '' 作为主机名,尽管这不是' t似乎也纠正了这个问题。 docs.python.org/2/library/socket.html
      • 注意:似乎暗示的(通过上面的这个答案)实际上失败了 - “提供了一个无效的参数”。应该在之前的评论中提到这一点。因此,要解释否决票:解决方案尚不清楚,而且似乎建议的内容不起作用。
      猜你喜欢
      • 2018-08-19
      • 2019-05-12
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多