2012-06-01 129 views
0

我有一個關於創建一個順序套接字管道以通過N-Hops路徑轉發TCP流的問題(S - - - > M1 - - - > M2 - - - > M3 - - > D)。 S的目標是通過TCP套接字將文件發送到D.因此,所有節點M1,M2和M3將以兩種模式運行,除服務器和客戶端外,S和D只能在一種模式下運行。通過TCP套接字進行文件傳輸C++中的管道

我的問題是:我可以創建一個套接字管道來形成這條路徑,所以當M1從S接收到第一個數據包時,它將直接向M2等等(即,不等待任何M的接收整個文件,只要發送你收到的即時)?基於可用的客戶端/服務器TCP套接字模型,如果可行,執行此任務需要什麼?

回答

0

是的,你可以......但你需要用一個事件循環來編程每臺機器(即套接字層不會爲你做)。

我這樣做的方式是讓每臺機器圍繞select()運行一個事件循環,使用一對非阻塞套接字(一個用於傳入數據,一個用於傳出數據)。每個進程都有一個小的(8kB?)內部緩衝區,它用來臨時存儲一些它想轉發的數據。

那麼你的選擇 - 循環將這些規則進行操作:

1)每當內部緩衝區低於全,告訴選擇()要當輸入數據插槽有通知數據準備好供您閱讀。

2)只要內部緩衝區大於空值,告訴select(),當傳出數據套接字有準備好寫入的緩衝區空間時,您希望得到通知。 3)每當select()指示傳入數據套接字已準備好供您讀取數據時,將傳入數據套接字中的一些數據讀入臨時本地緩衝區。 (您讀取的數量將受輸入數據套接字上可用數據量和本地緩衝區中可用空間量的限制,以較小者爲準)

4)每當select()指示給您傳出數據套接字具有要寫入的緩衝區空間,將一些數據從臨時本地緩衝區寫入傳出數據套接字。 (寫入的數量將受輸入數據套接字的數據量和輸出套接字當前可以接受的空間量的限制,以較小者爲準)

鑑於上述邏輯,字節將從每個以相當流水線的方式將節點連接到下一個節點。

(錯誤處理和建立通過插座(插座),連接()或綁定()/聽()/接受(),在此不再贅述,但也將是必要的)

+0

我們可以做這個工作作爲一個腳本來運行模塊,客戶端和服務器?這對我來說似乎很複雜,因爲它不是c編程方面的專家!你能幫助設置我可以開始的主體嗎? –

+0

你可以,但你必須做你自己的C編程,或僱人來爲你做。 –

+0

爲什麼使用fork()不是正確的選擇?服務器將爲傳入數據分配第一個孩子,第二個孩子用於傳出數據,同時等待新連接進入(即,任何節點都可能作爲中間人蔘與許多路徑)。 –