我正在编写一个非常简单的局域网服务发现协议.其 idea 是通过UDP向整个局域网广播服务器的连接数据.

我能够将数据从广播者传递给听众,但前提是我使用地址"0.0.0.0".如果我使用本地LAN地址+.255(LAN广播地址)我无法发送任何消息.

这是我广播的代码.py:

import asyncio
import asyncudp
from socket import gethostbyname, gethostname

def getBroadcastIp():
    ip = gethostbyname(gethostname())
    broadcast_ip = '.'.join(ip.split('.')[:-1]+["255"])
    print(broadcast_ip)
    # return broadcast_ip
    return '0.0.0.0'

async def broadcastUdp():
    bip = getBroadcastIp()
    while True:
        sock = await asyncudp.create_socket(remote_addr=(bip, 50000))
        print("Sending MESSAGE")
        sock.sendto(b'Message', addr=(bip, 50000))
        await asyncio.sleep(3)
        sock.close()

async def main():
    await asyncio.gather(*[
        # I have more stuff here
        asyncio.create_task(broadcastUdp())
    ])

asyncio.run(main())

这是我的听众.py:

import asyncio
import asyncudp
from socket import gethostbyname, gethostname

def getBroadcastIp():
    ip = gethostbyname(gethostname())
    broadcast_ip = '.'.join(ip.split('.')[:-1]+["255"])
    print(broadcast_ip)
    # return broadcast_ip
    return '0.0.0.0'

async def listenUdp():
    bip = getBroadcastIp()
    sock = await asyncudp.create_socket(local_addr=(bip, 50000))
    try:
        while True:
            data, addr = await asyncio.wait_for(sock.recvfrom(), 10)
            print("RECEIVING: ", data)
    except asyncio.TimeoutError:
        print('No data received in 10 seconds.')
        sock.close()


async def main():
    await asyncio.gather(*[
        # I have more stuff here
        asyncio.create_task(listenUdp())
    ])

asyncio.run(main())

0.0.0.0是广播的正确IP还是我遗漏了什么?

推荐答案

广播基本上不受欢迎,因为它会中断局域网上的every host个应用程序,甚至是那些不感兴趣的应用程序,例如路由、打印机等.广播已从IPv6中删除,因此应用程序无法移植,许多公司出于安全原因会拒绝使用广播的应用程序.做这些事情的现代方式使用多播,并且有几种注册的多播发现协议.多播只会中断感兴趣的设备.

为了构建应用程序,您希望感兴趣的设备订阅预定义的多播组(要么向IANA注册一个,要么在组织本地范围239.0.0.0/8中 Select 一个).当主机正确订阅一个多播组时,它将发送一个IGMP请求,这将通知多播路由和IGMP侦听交换机将该组的任何多播流量发送给请求主机.

多播源将发送到多播组地址的地址,所有订阅的主机将接收该地址,但不会中断任何未订阅多播组的主机.然后,接收主机可以使用自己的单播地址直接响应源单播地址.

Python相关问答推荐

Flask Jinja2如果语句总是计算为false&

在pandas/python中计数嵌套类别

在代码执行后关闭ChromeDriver窗口

使用字典或列表的值组合

在numpy数组中寻找楼梯状 struct

如果有2个或3个,则从pandas列中删除空格

统计numpy. ndarray中的项目列表出现次数的最快方法

为什么t sns.barplot图例不显示所有值?'

使用tqdm的进度条

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

504未连接IB API TWS错误—即使API连接显示已接受''

类型对象';敌人';没有属性';损害';

从`end_date`回溯,如何计算以极为单位的滚动统计量?

这是什么排序算法?(将迭代器与自身合并&&Q;)

不同 chromium 版本的selenium未检测到的 chromium 驱动器?

如何在Python中更改按钮的值(Flask )

在Pandas 数据框中,可以有一些多索引列和一些单索引列吗?

NumPy使用其他2个3D数组和一个1D数组创建一个3D数组来区分

如何将按钮移动到按钮在GRadio中使用或更改的框之前?

求和到目标的组合的递归函数中的记忆问题