2015-08-08 30 views
0

如果我在同一個LAN上有Windows和Linux機器,我可以使用(命名)管道在兩者之間進行通信嗎?Windows和Linux應用程序之間的管道

我特別想到在Windows端使用C#或VB.NET中的System.IO.Pipes命名空間。

+0

命名管道很少用於機器間通信,爲什麼使用它們而不是TCP? –

+0

我只是在學習更多關於管道的過程。 Windows允許您在同一LAN上的Windows機器之間使用管道。 TCP更適合機器間通信嗎? – mcu

回答

1

單獨命名管道無法通過IP完成此操作。最簡單的解決方案是在每臺機器上創建一個命名管道,並使用netcat(Linux中的nc)在管道之間發送信息。

我不知道如何在Windows工作,但我可以給Linux操作系統(相當,任何現代的Unix),這樣做的一個例子,可能有一些簡單的方法來做到適應本作的Windows:

machinea想與machineb交談。在某些程序寫入的/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/IP; netcat可以處理這個問題,而且他們只是和他們的命名管道通話,但是他們應該這樣做。

您可能需要擺弄打開命名管道的順序,打開讀取/寫入命令的程序並運行netcat命令。我從記憶中回答這個問題。

-1

命名管道爲從不用於intermachine通信。命名管道是文件系統中的一個特殊的inode(使其具有與任何其他文件一樣的名稱)。一個進程調用open(2)用於讀取或寫入(通常一個進程打開它用於讀取,另一個進程用於寫入)以及其他進程通過指定的FIFO連接到它。命名的fifos是專門在內核中實現的,因爲當FIFO爲空時,從它讀取的進程將被阻塞,等待它有數據。另外,當一個進程填滿FIFO時(它們的容量有限,因爲它們使用inode指針中的少量塊---只有直接塊),它在寫入時被阻塞,直到某些閱讀器清空FIFO數據。

由於文件系統中的一個文件只在承載它的服務器中可見,因此它沒有網絡可見性,並且不能用作網絡通信機制。

對於網絡通信,您有插座(2)(和朋友)接口。也存在所謂的Unix域套接字,它們是雙向的(也必須連接它們)的套接字,但是僅適用於本地使用,主要是因爲它們不使用完整的TCP/IP協議棧將一端連接到另一端。他們看上去像這樣(在第一模式位置p)在LS(1)列表:

[email protected]:/run$ ll hogsuspend 
prw------- 1 root root 0 ago 10 16:54 hogsuspend 

和Unix套接字願意這樣做:

[email protected]:/run$ ll /dev/gpmctl 
srwxrwxrwx 1 root root 0 ago 10 16:54 /dev/gpmctl 

(與s

+0

https://msdn.microsoft.com/en-us/library/aa365590%28VS.85%29.aspx _Named管道可用於在同一臺計算機上的進程之間或網絡上不同計算機上的進程之間提供通信。 _ – mcu

+0

microsoft中的命名管道與unix/linux中的命名管道不同...... –

+0

@mcu,可能是這樣,但它並不會使我的響應無效。沒有看到以這種方式使其失效的理由。命名管道來通信網絡間節點需要一些確保通信可用的方法,所以我無法想象簡單的管道的「open」,「read」,「write」和「close」語義,而不需要OS提供更多的內核支持。無論哪種情況,問題都是** ...在Windows/Linux機器之間**,意味着互操作性。你有沒有嘗試過命名管道的Windows連接到Linux的命名管道?如果linux不支持它們,他們應該怎麼做? –

相關問題