2010-09-10 20 views
6

下面是這種情況:是否有可能使用文件作爲兩個遠程進程之間的雙向通信通道(排序「文件上的套接字」)?

  • 的用戶有兩臺機器

  • 這些機器不能用,因爲防火牆的限制

  • 但是,無論是網絡套接字通信,訪問訪問在第三臺機器上具有讀/寫權限的通用網絡共享

我的問題重要性在於:是否可以編寫在兩臺機器上執行的小應用程序,以便通過僅使用網絡共享上的文件建立兩者之間的通信通道?理想情況下,它會模擬流和套接字的行爲。

我想象:

1)這將涉及到具有用於通信的兩個文件,每個方向一個

2)和具有讀取文件,而另一個進程正在寫入它的可能性。通過網絡。

但我不確定這是否可行,主要是因爲我懷疑2)。儘管如此,也許可以在類似Unix的環境中使用NFS。

可能嗎?它是否已經存在?

回答

2

我認爲這是第一拆分流分成分組是一個好主意。然後這些數據包應該顯示爲通用目錄中的文件。這兩種方式必須有兩個「命名空間」(a-> b和b-> a)。爲了方便調試,文件名應該包含一個時間戳,而不僅僅是一個增量部分。

文件只有一個問題:即使文件很小,接收者可以在它沒有完全刷新時捕獲它,我的意思是文件只有一半準備好(常見情況:0字節長)或網絡轉移期間發生錯誤。避免這種情況,發件人應該:

  • 創建一個臨時名稱的文件,
  • 寫的內容,將其關閉,
  • 然後將其重命名爲最終名稱(時間戳等) 。

因此,接收器只會在重命名完成後纔會選擇該文件,當它完全確定時,它會被完全寫入。

之前發送一個新的文件,發送者可以檢查臨時文件,如果存在的話,就意味着最後的發射被中止。

當創建一個新的發送文件,發送者應該創建一個信息文件,其中包含關於發送數據包的信息被髮送,因此在墮胎,這將包含有關失敗的分組信息。也許,唯一的信息是傳輸時間(記住:臨時文件名不包含時間戳),但總比沒有好。

+0

謝謝,我認爲你的答案是一個好的開始。信息文件也是一個好主意,充當錯誤檢測機制。 – 2011-04-13 18:32:09

1

如何:
當機A想將消息發送到計算機B上,它創建了一個名爲_toBfromA_12782文件(其中12782當前時間戳)。它將內容寫入文件,然後更改名稱以刪除第一個下劃線。
每隔幾秒鐘,每臺機器都會檢查是否有文件名以toX開頭,其中X是他們自己的名稱。如果找到多條消息,則可以根據時間戳進行排序。閱讀郵件文件後,收件人將刪除該文件。
這假定所有的參與者都有一個同步的時間,但如果他們不這樣做也可以計算出來(或實際上被忽略)。

+0

這聽起來不錯。 +1。但我認爲同步問題會出現太多與多個文件(時間戳問題)。像流和套接字一樣「阻塞」行爲似乎很困難。 – 2011-04-09 08:33:28

+1

使用文件名中的自動遞增ID解決同步問題。這樣你也可以檢測到丟失的消息。看看電信調解設備。這些技術正在使用這種技術來批量處理來自網絡交換機的收費數據文件。 – Bernd 2011-04-11 11:00:05

0

我依稀記得UNIX上的fifo文件。網絡搜索已經證實,他們是我記得(通過文件進行溝通的一種方式)。我沒有測試過它們是否可以在兩臺不同的機器之間工作,這些機器可以訪問相同的文件系統,但我認爲它可能會。當我訪問Unix系統來滿足我的好奇心時,我可能會嘲笑一些事情。

基本上,您必須使用mkfifo創建一個FIFO文件。然後,您可以打開文件並使用阻止讀取/寫入來處理它(每個「打開」可以同時讀取或寫入,因此您需要每個方向一個)。一些其他的過程描述,包括一些代碼示例可以在herehere中找到。

我測試mkfifo,使用標準的Unix命令:

創建管:

mkfifo mypipe 

寫從一個窗口到管一切:

cat > mypipe 

閱讀一切從管另一個窗口:

cat mypipe 

管道和預期一樣,類型在一個窗口,它出現在其他的,然而可悲的是,這只是似乎工作(至少對我來說),當進程在同一臺機器上運行,所以它並沒有真正幫助你的問題。但我會離開這個答案的情況下,它有助於在未來的人......

+1

正如您發現的,NFS掛載的分區上的FIFO不會充當機器間IPC機制。 – Alnitak 2011-04-08 07:17:31

+1

有趣!太糟糕了,它不適用於網絡文件系統.. – 2011-04-09 08:25:17

0

也許嘗試,如果這些解決方案的一個適合你,取決於如果你的網絡系統允許的提到的監測方法之一:

Monitoring a folder for new files in Windows

製作2個文件夾,每個進程寫入到其中一個文件夾,使用時間戳作爲文件名,以獨佔模式寫入。 每個進程都會監視其他文件夾,並且當文件出現時,您會等到完全寫入,然後將其讀取,然後將其刪除。

+0

相當複雜的解決方案,當我們考慮進程間通信和同步時不可靠。 – OnaBai 2012-11-25 00:15:09

相關問題