簡體   English   中英

UDP傳輸和維護網絡字節順序

[英]UDP transfer & maintaining network byte order

因此,我在通過C ++中的客戶端服務器程序發送和接收自定義數據包時遇到了一些麻煩。 我已經使用TCP實現了類似的操作,但是在使用UDP時將所有內容轉換為單個數據報時遇到了問題。

目前,我的標題包含偶數個uint32_t字段。 這些中的每一個都以網絡順序存儲,就像在頭結構中一樣:

 uint32_t x = htonl (int y);

...

我將報頭與有效負載組合在數據包中,如下所示:

 typedef struct {
    450Header header; // 512 bytes consisting of the unint32_t like above
    char data[ BLOCKSIZE ];  // 3.5k
    // Total Packet Size = 4k
} Packet;

標頭部分將包含有關數據包的信息,我的問題是如何處理字符串和有效負載的字節順序。 理想情況下,我想在標頭中添加一些字符串字段,例如文件名,如果我發送的文件大於數據包中的塊大小,我想將其拆分為多個數據包,我需要知道如何拆分文件,以便可以按正確的順序解釋接收端。

  1. 我已經成功地獨立構建了一個標頭(所有字段均按網絡字節順序排列),如果將它們添加到標頭中,是否還需要轉換字符串的順序? 我假設如果將字符串保持在設定的大小,我仍然可以為標頭編寫一個校驗和函數。

  2. 如果從問題1正確訂購了所有東西,是否需要在接收端將它們再次轉換回主機順序?

  3. 我有一個mmap函數,可以將文件加載到char緩沖區中,我可以使用memcpy之類的東西並遞增偏移量來簡單地將此片段復制到Packet的數據緩沖區中嗎? 還是我還要擔心有效載荷數據的網絡順序?

  4. 我需要在有效載荷上使用校驗和嗎? 如果不使用整個緩沖區並以奇數個字節結尾,該怎么辦?

最終,我希望報頭包含序列號,以便在丟包(即返回N)時可以練習實施程序,所以我最擔心的是標准化一切從客戶端發送的順序,以便可以對其進行解釋在服務器端以正確的順序排列。

8位數據(包括8位整數,Ansi / UTF-8字符串等)不存在字節順序問題,因此您可以按原樣發送/接收它們。 您只需要處理字節順序就可以是多字節數據(例如16位/ 32位整數,16位UCS2 / UTF-16字符串等)。 例如,整數應始終以網絡字節順序排列,但是UTF-16字符串可以自行決定使用UTF-16LE還是UTF-16BE(盡管您應該改用UTF-8)。

如果必須將數據分成多個包,則需要在信息包頭中放入信息以指定信息包的順序。 UDP不保證數據包以發送時的順序到達,甚至不保證它們到達。 因此,接收器需要收集數據包(根據需要請求丟失的數據包),然后在處理數據之前對它們進行相應的重新排序。

是的,您應該始終在發送數據包之前將其轉換為網絡字節順序,並在接收端對其進行處理時將其轉換回主機字節順序。 轉換為網絡字節順序僅用於傳輸目的,以確保跨平台的格式一致。

校驗和是確保每個數據包數據完整性的一個好主意,但這不是必需的。 您可以肯定地為任意長度的數據提供了固定長度的校驗和,有很多校驗和算法都支持該算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM