繁体   English   中英

在 Python 中发送广播

[英]Sending broadcast in 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, socket.SO_BROADCAST, 1)
    #  sock.settimeout(2)
    while True:

        sock.sendto(bytes("test", "utf-8"), ("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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM