【问题标题】:Sending broadcast in Python在 Python 中发送广播
【发布时间】:2021-01-11 22:30:41
【问题描述】:

我正在尝试学习编写套接字(在 Python 3 中),我只是尝试从服务器发送广播并从客户端接收它。

我的问题是,每当我尝试将数据包发送到 255.255.255.255 时,似乎实际上什么都没有发送。 我尝试使用wireshark查找数据包,但除了环回接口外,我找不到任何数据包。

手动输入IP可以在两台电脑之间成功发送消息,并且在wireshark中也看到了包。

这是客户端的代码

import socket


sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind(("0.0.0.0", 5005))
while True:
    # sock.sendto(bytes("hello", "utf-8"), ip_co)
    data, addr = sock.recvfrom(1024)
    print(data)

这是服务器的代码

import socket
from time import sleep

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)  # UDP
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    #  sock.settimeout(2)
    while True:

        sock.sendto(bytes("test", "utf-8"), ("255.255.255.255", 5005))

        sleep(1)


main()

对不起,如果代码很难看,我对套接字和 python 很陌生。

【问题讨论】:

    标签: python udp broadcast


    【解决方案1】:

    原因是您在一个接口上广播并在另一个接口上收听。看到这个答案UDP-Broadcast on all interfaces

    您需要在所有接口上广播,例如使用以下(纯粹用于演示)代码。但是,请记住,IP 广播是一项已从 IPv6 中删除的遗留功能。请改用多播。

    import socket
    from time import sleep
    
    def main():
        interfaces = socket.getaddrinfo(host=socket.gethostname(), port=None, family=socket.AF_INET)
        allips = [ip[-1][0] for ip in interfaces]
    
        msg = b'hello world'
        while True:
    
            for ip in allips:
                print(f'sending on {ip}')
                sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)  # UDP
                sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
                sock.bind((ip,0))
                sock.sendto(msg, ("255.255.255.255", 5005))
                sock.close()
    
            sleep(2)
    
    
    main()
    

    【讨论】:

    • 感谢您的帮助,我从那个答案中了解到,我需要找到我要广播到的特定接口的广播地址,试了一下,它成功了!但是我想让我的服务器在任何网络上工作,而不必手动输入 IP,我可以使用我认为的掩码来做到这一点......我现在的问题是实际找到网络正在使用的掩码
    • 我已经更新了答案以显示如何获取所有 IP 的列表,然后在所有接口上广播。这段代码纯粹是为了演示——它既不是最健壮也不是最有效的。您可能还希望将环回地址添加到列表allips
    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2016-07-26
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多