UDP包結構
// 參考: http://www.2cto.com/net/201307/224715.html
UDP數據包由首部和數據組成,每行4個字節(32位),首部固定長度為8個字節(2行)
2、首部
1、 第一行:源端口16位,目的端口16位
表示發送方和接收方的端口號
2、 第二行:UDP包長度16位,UDP校驗和16位
UDP包長度:
包括UDP首部在內的以字節為單位的UDP數據報總長度;
校驗和:
【待補充算法】
3、數據
IP首部結束之后的部分
編程應用:
//參考: UDP數據包大小和結構 http://blog.csdn.net/nokiaxjw/article/details/8094605
//參考: UDP數據包大小問題 http://blog.csdn.net/buptzwp/article/details/5055487
你用UDP發一包就是一包.要么收到,要么收不到一個完整的包.不能超過路由長度.一個數據包=包頭+數據 包頭包含了一些基本信息,如包類型是命令還是數據,包總數,當前包編號等等。如果你想知道該讀取多少信息,在包頭中保存后面數據部分的長度,同時包頭寫成一個定長結構體,你讀取一個包的時候,先把讀取定長的包頭信息,再根據包頭里面的長度len信息來讀取len字節的數據,就是后面的數據部分的長度。 如果你包的設計是不定長的,包頭應該是一個共用結構體,讀取時,分兩步, struct Header { char msg_type; //包類型 命令或者數據 int total; //總包數 int curr; //當前包數 int len; //數據部分的長度 }; 1、recv(socket,buf,sizeof(struct Header)); //讀取包頭,已獲取基本控制信息 struct Header h; memcpy(&h,buf,sizeof(h)); 2、recv(socket,buf,h.len); //讀取數據部分 if ( h.msg_type == XX ) { } else { } 你用UDP發一包就是一包.要么收到,要么收不到一個完整的包.不能超過路由長度.如果你要分很多小包一個UDP一個的發.你得自己定義協議.序列號+長度+內容+是否有后序標志 +檢驗證。
