用Python发送广播

问题描述

我正在尝试学习对套接字进行编码(在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,1)
    #  sock.settimeout(2)
    while True:

        sock.sendto(bytes("test",("255.255.255.255",5005))

        sleep(1)


main()

很抱歉,如果代码丑陋,我对套接字和python还是陌生的。

解决方法

原因是您正在一个接口上广播而在另一个接口上收听。请参阅此答案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()