2012-04-17 62 views
2

我是新來的套接字編程,我需要實現基於UDP的無比率文件傳輸系統來驗證我的研究計劃。這裏是我需要做的:一個基於UDP套接字的無比率文件傳輸

我想要一個服務器S發送文件到一組對等體A,B,C ..等文件被分爲多個數據包。開始時,對等方會向服務器發送請求消息以初始化傳輸。每當S收到來自客戶端的請求時,它都會無條件地傳輸編碼數據包(如何編碼是由我的設計完成的,編碼本身具有擦除糾正功能,這就是爲什麼我可以通過UDP無比率地傳輸)給客戶端。客戶端不斷收集數據包並嘗試解碼它們。當它最終解碼所有數據包併成功重新構建文件時,它會向服務器發回停止消息,並且S將停止傳輸到此客戶端。

異步請求異步文件(他們可能會在不同的時間請求文件)。服務器必須能夠同時爲多個對等服務。不同客戶端的編碼數據包不同(它們都是從相同的源數據包編碼的,儘管如此)。

這是我在考慮的實現。儘管我對unix網絡編程沒有多少經驗,所以我想知道你能否幫我評估一下,看看它是否可行或有效。

  1. 我要實現服務器作爲併發UDP服務器與兩個套接字端口(類似於根據UNP書TFTP)。一種是接收控制消息,就像在我的上下文中那樣是請求和停止消息。服務器將爲每個請求維護一個標誌(最初爲1)。當它收到來自客戶端的停止消息時,該標誌將被設置爲0.

  2. 當服務器接收到請求時,它將fork()一個新進程,使用第二個套接字和端口將編碼數據包發送到客戶端。只要標誌爲1,服務器就會一直向客戶端發送數據包。當它變爲0時,發送結束。

  3. 客戶端程序很容易做到。只需發送Request,recvfrom()服務器,逐步解碼文件並在最後發送停止消息。

此設計是否可行?我所關心的主要問題是:(1)通過分叉多個進程來提高效率?或者我應該使用線程? (2)如果我必須使用多個進程,該子進程怎樣才能知道該標誌位?感謝您的意見。

+0

你如何定義無比率? – Indy9000 2012-04-17 17:33:40

+0

你使用哪種編程語言? – 2012-04-17 17:37:03

回答

0

使用UDB進行文件傳輸並不是最好的想法。服務器或客戶端無法知道是否有數據包丟失,因此只有在重建過程中假設您有某種機制(如計數器)才能檢測到丟失的數據包。然後很難只請求那些丟失的數據包之一。最後,你將擁有一個能夠完成TCP套接字的代碼。所以我建議從TCP開始。

服務器的典型設計涉及一個偵聽器線程,該線程在有新的客戶端請求時產生一個工作線程。該新線程將處理與該特定客戶端的通信,然後結束。你應該保持同時服務的客戶端(線程)的限制。不要爲每個客戶端產生一個新的進程 - 這是低效率的,不需要的,因爲這會給你帶來任何線程無法實現的東西。

線程編程需要謹慎,所以不要偷工減料。否則,你將很難發現和診斷問題。

+0

我的編碼方案有一種糾刪能力,所以不需要重傳。原則是,對於n個源數據包,接收到的任何n個或略多於n個編碼數據包能夠成功恢復n個源數據包。一個優秀的代碼表示這個想法被稱爲LT(Luby變換)代碼。使用此功能,使用UDP可以節省協議開銷和握手時間。但是,解碼會很耗時,這就是爲什麼我要檢查實現以查看協議開銷與解碼時間之間的這種折衷是否值得。 – 2012-04-17 19:33:13

+0

順便說一句,當產生一個新的線程來與客戶端進行通信時,我_have_在該線程中生成另一個套接字併爲該客戶端使用一個新的端口,對吧? – 2012-04-17 19:48:36

+0

是的,您需要新的套接字才能與每個客戶端進行通信。使用UDP,你可以使用相同的套接字,但由於每個客戶端都會有新的線程,所以你應該爲每個線程創建一個新套接字。 – 2012-04-17 20:14:53

0

與UDP傳輸文件時便會樂趣:(

你的結構/類爲每個消息應包含一個序列號和校驗和。這將使每一個客戶端進行檢測,並要求對方重傳,任何缺失在這個傳輸結束時,你可以UDP傳播整個文件到所有的客戶端,然後在最後依次詢問每個客戶端它會阻止它丟失,併發送這些。我希望卡巴斯基等將使用這種方案來更新我所有的本地盒子。我在CANBUS網絡中使用了這樣的廣播方案,其中有數十個需要下載新圖像的微控制器。軟件升級需要幾分鐘而不是幾個小時。