2009-11-23 63 views
0

有沒有一種很好的方法可以將文件從客戶端傳輸到服務器? 可能只是圖像,但我的教授要求任何類型的文件。有關套接字編程的文件傳輸問題

我環顧四周,對於總體思路有點困惑。

所以,如果我們有一個大文件,我們可以將該文件分割成段...?然後將每個分段發送到服務器。

我是否也應該使用while循環來接收服務器端的所有文件/段?另外,我的服務器如何知道是否收到了所有的分段,而不必知道有多少分段?

我一直在尋找的CPLUSPLUS網站上,發現有一個像文件的二進制傳輸...

感謝所有幫助=)

回答

2

如果您使用的是TCP:

你說得對,沒有辦法「知道」你有多少數據接收。這給你幾個選擇:

1)在發送圖像數據之前,首先發送預期的字節數。所以你的前4個字節可能是4個字節的整數「4096」。然後你的客戶端可以讀取前4個字節,「知道」它期待4096字節,然後malloc(4096),因此可以期待其餘的。然後,你的服務器可以發送()4096字節的圖像數據。

當您這樣做時,請注意,您可能必須多次recv() - 由於某種原因,您可能未收到全部4096個字節。所以你需要檢查recv()的返回值以確保你已經得到了一切。

2)如果你只是發送一個文件,你可以讓你的接收器讀取它。它可以保持從套接字recv(),直到服務器關閉連接。這有點困難 - 你將不得不跟蹤你收到了多少,然後如果你的緩衝區已滿,你將不得不重新分配它。我不推薦這種方法,但它會在技術上完成任務。

如果使用UDP:

這意味着你沒有可靠傳輸。所以數據包可能會被丟棄。他們也可能無序到達。所以如果你打算使用UDP,你必須將你的數據分成幾段。發送方和接收方都必須就分段的大小達成一致(100字節?1000字節?)

不僅如此,還必須爲每個數據包發送一個序列號 - 即標記每個數據包#1 ,#2等等。因爲你的客戶端必須能夠告訴:如果有任何數據包丟失(你收到數據包1,2和4,因此缺少#3)並確保他們按順序(你收到3, 2,然後是1 - 但是當您將它們保存到文件時,您必須確保數據包按照正確的順序保存,1,2,然後是3)。

因此,對於你的任務,那麼它將取決於你必須/允許使用的協議。

2

如果使用的是基於UDP傳輸協議,您將不得不將文件分成塊以進行網絡傳輸。您還必須在接收端以正確的順序重新組合它們並驗證結果。如果您使用基於TCP的傳輸協議,所有這些都將在後臺處理。

您應該諮詢Beej's Guide to Network Programming瞭解如何最好地發送和接收數據以及使用套接字。它解釋了你所問的大部分事情。

0

有很多傳輸文件的方法。如果你在無損莊園中傳輸文件,那麼你基本上會把文件分成塊。用序號標記每個塊。將塊發送到另一側並重新構建文件。面向流的協議比較簡單,因爲如果數據包丟失,數據包將被重新傳輸。如果您使用不可靠的協議,那麼您將需要重新傳輸丟失的數據包和重新排序的塊,這些塊的順序不正確。

如果有損傳輸是可以接受的(如傳輸視頻或在線遊戲數據),則使用不可靠的協議。有損傳輸更簡單,因爲您不必重新傳輸丟失的塊。你所需要做的就是確保塊按照正確的順序進行處理。

許多協議發送一個結束符數據包來指示傳輸結束。如果您不希望在傳輸之前將塊數發送到另一側,則可以使用此策略。