linux - Linux 上的一对多进程间通信

标签 linux sockets

我有一个生成一些日志的“服务器”进程。我希望用户(或某些其他服务)能够查看该日志流(如 tail -f),但我不想将这些日志写入文件系统。我可以在 Linux 上执行此操作吗?

  1. 我的第一次尝试是在环回接口(interface)上使用 UDP。服务器将数据包发送到端口 12345 上的本地主机,客户端可以绑定(bind)到该端口以接收数据包。不起作用。因为只有一个客户端可以绑定(bind)到同一个套接字。啊!但是您可能会说使用 SO_REUSE_ADDR,它允许两个客户端绑定(bind)到一个端口,但只有一个客户端接收消息。

  2. 接下来,我在环回接口(interface)上尝试了 UDP 多播。到目前为止还没有,因为我的内核不支持环回接口(interface)上的多播。根据 ifconfig:

    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:186 errors:0 dropped:0 overruns:0 frame:0
              TX packets:186 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:11904 (11.6 KiB)  TX bytes:11904 (11.6 KiB)
    

    请注意上面缺少 MULTICAST(或者实际上是 BROADCAST)。

有人有什么想法吗?我可以使用命名管道或 Unix 域套接字来解决这个问题吗?

我想避免任何允许(非特权)监听器影响(特权)服务器的事情。例如,我宁愿删除日志也不愿阻止服务器。

我正在用 Python 做所有这些,如果这有什么不同的话。

最佳答案

你可以看看 ZeroMQ。您所描述的是对发布者/订阅者模式的需求,这正是 ZeroMQ 确实非常优雅地做的事情。它还有一个额外的优势,即在底层使用何种传输方式时非常灵活; IPC、TCP 等。这使得将程序的一部分放在网络上的其他地方变得非常简单。使用 ZeroMQ,您将得到非常简单的源代码,复杂性都隐藏在 zmq 库中。您可以先看一下 guide 的这一部分。

您也可以考虑 NanoMSG(即将推出的 ZeroMQ-做得更好),但我不确定它是否具有 Python 绑定(bind)。

关于linux - Linux 上的一对多进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32015332/

相关文章:

linux - 如何从特定行启动 shell 脚本?

C++ 通过 UDP 套接字发送结构

javascript - chrome.sockets.tcp.secure 和 TLS 握手未按预期工作

c++ - inotify 和 epoll 的区别

linux - 使用bash将一个文件中的行内容复制到另一个文件中的特定字符位置

java - Tomcat 不会停止。我该如何调试呢?

c - 带有指针成员的recv数据包

c - 如果套接字通信的另一端关闭,为什么 recv() 不设置 errno?

c++ - 在 Windows 上使用 native C++ 在具有多个网络适配器的机器上进行 UDP 广播

c++ - C/C++ 中的 CGI/FastCGI 应用程序(套接字编程问题)