LINUX:跨局域网的管道是不是可能?如果是这样,它是不是可取?还都有哪些其他选择?

Posted

技术标签:

【中文标题】LINUX:跨局域网的管道是不是可能?如果是这样,它是不是可取?还都有哪些其他选择?【英文标题】:LINUX: Is piping across a LAN possible? If so, is it desirable? What are some other options?LINUX:跨局域网的管道是否可能?如果是这样,它是否可取?还有哪些其他选择? 【发布时间】:2010-12-05 20:31:56 【问题描述】:

我目前正在使用 C++ 为 ubuntu 服务器创建可扩展的服务器设计。跨局域网的管道是否可以实现?什么是快速 LAN 间通信的最佳选择?

感兴趣的人的背景信息: 我正在和朋友一起制作多人游戏。它将基于 TCP。对于 linux 来说,使服务器成为多客户端似乎意味着为每个客户端创建一个新进程或通过连接客户端的 fdset 进行选择()。我想结合这些方法,并有一个“经理”流程,该流程将选择大约 100 个客户端,并将链上的任何更改报告给“任务主管”流程,然后将更改分发给其他经理流程。如果经理和任务主管在同一个盒子上,这将适用于管道,但如果我想稍后扩展它,我需要一种快速的局域网间通信方法。

【问题讨论】:

这并不是管道真正的作用。您需要使用套接字。而且您不一定需要一个新流程来成为多客户端。如果每个客户都衍生出一个新流程,您将无法很好地扩大规模。 @Falmarri:当然,这就是为什么我正在考虑一个新流程来处理多达 100 个客户。 【参考方案1】:

检查 netcat 应用程序。在一台机器上,您可以将 netcat 作为服务器运行,将输出通过管道传输到您的进程:

nc -l -p 1234 | myApp

这将侦听 TCP 端口 1234,并通过标准输出打印它接收到的所有内容。

在第二台机器上:

myApp | nc 192.168.1.2 1234

其中 192.168.1.2 是第一台机器的 IP 地址。您需要查看 nc 手册页以了解具体细节 - 以上内容均来自记忆。

【讨论】:

【参考方案2】:

流套接字(SOCK_STREAM,如果是严格本地的,则与 AF_UNIX 组合;如果通过 tcp/ip,则与 AF_INET 组合)是双向管道的网络等价物,所有数据都是有序的。

【讨论】:

好的,谢谢。这将是严格的本地化。我在 reddit 上收到的一些建议是实现某种类型的多播系统并完全删除 taskmaster。【参考方案3】:

正如您提出这个问题的方式,您似乎认为对于相关进程之间的通信,管道是必要的答案。

考虑它的方式是,您需要两个进程之间的通信,无论它们是系统中的几个组件、客户端服务器对还是其他什么。然后,您选择一种适用于给定地理位置的机制。如果进程是本地的,则管道可以工作。您还可以将共享内存队列用于无复制通道。您还可以在环回接口上使用 IP(通过套接字)。要穿越网络(WAN 或 LAN),您几乎必须使用 IP。

最后,除了 TCP,还可以考虑使用 UDP,因为您可以获得内置的消息边界和更轻松的端点管理。

【讨论】:

【参考方案4】:

LAN 通常是基于以太网的网络。这意味着在您的网络上运行的任何协议都必须基于以太网。 TCP/IP 可以并且确实在以太网网络上运行,但管道和本地套接字仅设计为单个主机上的进程间通信,因此完全不适合多主机应用程序。

如果各种组件在不同的主机上运行,​​您将需要通过一些基于 TCP/IP 的协议来链接它们。有一些传统协议(如 IPX 和 UUCP)在以太网上运行,但这些协议已完全被 TCP/IP 取代。

【讨论】:

以上是关于LINUX:跨局域网的管道是不是可能?如果是这样,它是不是可取?还都有哪些其他选择?的主要内容,如果未能解决你的问题,请参考以下文章

利用SSH 反向代理 ,实现跨局域网连接家里的linux 主机 (树莓派)

在 Perl 中打开管道是不是涉及 shell?

PHP跨域上传的几种方法

linux查看是不是有某个运行的进程命令

内存映射文件比命名管道快吗?

跨管道传播退出状态