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

时间:2015-08-08 18:57:20

标签: c# linux pipe named-pipes data-transfer

如果我在同一个局域网上安装了Windows和Linux机器,我可以使用(命名)管道在两者之间进行通话吗?

我特别考虑在Windows端使用C#或VB.NET中的System.IO.Pipes命名空间。

2 个答案:

答案 0 :(得分:1)

单独使用命名管道无法通过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连接,并将输出写入命名管道。运行cat /tmp/mypipe | nc machineb 9000以从其命名管道读取并将读取数据传输到netcat以将其发送到机器B.当然,在A和B上运行的程序不“关心”管道信息是否已经过去TCP / IP; netcat处理它,他们只是与他们的命名管道交谈,但他们应该这样做。

您可能需要调整打开命名管道的顺序,打开读取/写入程序的程序,然后运行netcat命令。我是从记忆中回答的。

答案 1 :(得分:-1)

命名管道从不用于机器间通信。命名管道是文件系统中的一个特殊inode(使其具有与任何其他文件类似的名称)一个进程调用 open(2)进行读取或写入(通常一个进程打开它以进行读取和写入其他用于写入)和其他进程通过命名FIFO连接到它。命名的fifos是在内核中专门实现的,因为当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