gpt4 book ai didi

Linux:操作系统对非特权进程间总线的支持

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:06 25 4
gpt4 key购买 nike

我正在尝试寻找一种简单的解决方案,用于在 Linux 主机上运行的非特权进程之间进行高性能广播/多播通信。我正在寻找一种解决方案,它 1) 简单,2) 无特权(无 root),3) 语言独立,4) 面向数据包,5) 高效(Gbit/s 及以上)。

为了说明这一点,我现有的代码只是使用 UDP 套接字进行单播通信,这完全符合上述要求(除了单播)。我研究过通过让多个程序监听同一 UDP 端口(使用 SO_REUSEADDR 和/或 SO_REUSEPORT )来将其扩展为多播,但这实际上并没有将数据包的副本分发到所有进程。

我还研究过使用环回广播 (127.255.255.255) 来到达多个监听进程,但似乎我需要绑定(bind)到环回设备上的多个 IP 地址才能使其工作,并且添加这些地址需要 root。

最佳答案

根据皮特的建议,我找到了以下解决方案,该解决方案并不太复杂。

以下 Python 2 程序通过多播/环回实现一个简单的聊天程序。在 Linux 3.13/Ubuntu 14.04 上测试。

import os, socket, sys

# Use an administratively scoped multicast IP (RFC 2365).
mcast_group = '239.0.0.0'
port = 1234

# Communicate over the loopback interface.
ifc = '127.0.0.1'

def send(data):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)

# Send over loopback interface.
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF,
socket.inet_aton(ifc))

sock.sendto(data, (mcast_group, port))

def listen():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)

# Join group.
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(mcast_group) + socket.inet_aton(ifc))

# Allow multiple subscribers.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sock.bind((mcast_group, port))
while True:
data, remote = sock.recvfrom(1024)
print '#%d (%s:%d): %s' % ( (os.getpid(),) + remote + (data,) )


args = ' '.join(sys.argv[1:])
if args:
send(args)
else:
listen()

通过设置 ifc = '0.0.0.0' 并取消设置 IP_MULTICAST_IF 选项,这可以轻松扩展为跨本地广播段 (LAN) 的通信。

接收自己的流量

唯一的问题是,似乎没有简单的方法可以加入群组并向群组中的其他人发送消息,而无需获得自己的流量(即使使用相同的套接字来监听和发送)。

IPPROTO_IP 套接字选项 IP_MULTICAST_LOOP 不起作用;当使用环回接口(interface)时它不起作用,并且当通过网络通信时它会阻止其他本地客户端接收消息。

不过,我可以通过过滤源地址来解决这个问题。

(顺便说一句,我刚刚意识到 QEMU 包含 native support,用于使用多播发送虚拟网络流量。Faced with the above problem, QEMU 开发人员还讨论了基于源地址的过滤,尽管他们似乎从未真正对此做过任何事情。因此,QEMU VM 收到其自己的传出流量的副本,尽管该流量通常在网络堆栈中被拒绝。)

关于Linux:操作系统对非特权进程间总线的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23993338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com