Windows 和 Linux 应用程序之间的管道

问题描述 投票:0回答:2

如果我在同一 LAN 上有一台 Windows 机器和一台 Linux 机器,我可以使用(命名)管道在两者之间进行通信吗?

我特别考虑在 Windows 端的 C# 或 VB.NET 中使用

System.IO.Pipes
命名空间。

c# linux pipe named-pipes data-transfer
2个回答
2
投票

仅靠命名管道无法通过 IP 完成此任务。最简单的解决方案是在每台计算机上创建一个命名管道,并使用 netcat(Linux 中的

nc
)在管道之间发送信息。

我不知道它在 Windows 中是如何工作的,但我可以举一个在 Linux(而不是任何现代 Unix)中执行此操作的示例,并且可能有一些简单的方法可以将其应用于 Windows:

machinea
想与
machineb
交谈。 A 在
/tmp/mypipe
处打开某个程序写入的命名管道。 B 在
/tmp/mypipe
打开命名管道,某些程序从中读取数据。 B 运行
nc -l 9000 > /tmp/mypipe
来侦听端口 9000 上的 TCP/IP 连接并将输出写入命名管道。 A 运行
cat /tmp/mypipe | nc machineb 9000
从其命名管道中读取数据,并将读取的数据通过管道传输到 netcat,以将其发送到机器 B。当然,在 A 和 B 上运行的程序并不“关心”管道信息是否通过 TCP/知识产权; netcat 处理这个问题,他们只是与他们的命名管道对话,但是他们应该这样做。

您可能需要调整打开命名管道、打开从中读取/写入的程序以及运行 netcat 命令的顺序。我凭记忆回答这个问题。


-2
投票

命名管道从不用于机器间通信。命名管道是文件系统中的一种特殊 inode(这使得它具有像任何其他文件一样的名称)一个进程调用 open(2) 进行读取或写入(通常一个进程打开它进行读取,另一个进程进行写入)其他进程通过指定的 FIFO 连接到它。命名的 fifo 是在内核中专门实现的,当 FIFO 为空时,从中读取数据的进程将被阻塞,等待它有数据。此外,当一个进程填满 FIFO 时(它们的容量有限,因为它们使用 inode 指针中的少量块 --- 仅直接块),它在写入时会被阻塞,直到某些读取器清空 fifo 数据为止。

由于文件系统中的一个文件仅在托管它的服务器中可见,因此它没有网络可见性,并且不能用作网络通信机制。

对于网络通信,您有 socket(2) (和朋友)接口。还存在所谓的 Unix 域套接字,它们是双向意义上的套接字(并且您也必须连接它们),但仅供本地使用,主要是因为它们不使用完整的 TCP /IP 堆栈,用于一端与另一端进行通信。它们在

ls(1)
列表中看起来像这样(在第一个模式位置有 p):

luis@asus-luis:/run$ ll hogsuspend 
prw------- 1 root root 0 ago 10 16:54 hogsuspend

unix 套接字是这样做的:

luis@asus-luis:/run$ ll /dev/gpmctl 
srwxrwxrwx 1 root root 0 ago 10 16:54 /dev/gpmctl

(带有

s


@mcu,为了能够在网络中的机器之间使用某些通信方式,您需要使用网络兼容技术。管道最初是在 UNIX 环境中发明的,并且没有使用任何网络功能,从那时起一直如此,微软将该术语改编为他们用来在机器之间进行相互通信的东西。如今,Windows 中的所有通信基础设施都部分或完全使用 TCP/IP 堆栈。这意味着命名管道在使用网络资源时,应该以某种方式使用某种进程来创建 TCP/IP 资源的网关。在这种情况下,可能会使用 TCP 套接字(如果您想保持可靠性)来进行机器之间的互连。我实际上不知道 Windows 命名管道背后的机制或如何与网络互操作。我会为您找到一些信息,并尝试扩展我的解释以对您有用。

© www.soinside.com 2019 - 2024. All rights reserved.