在進行網路傳輸的時候,常常會定義協議的書庫型別,json,還是結構體。
下面就說說其中要注意的事項
如何獲取結構體的長度
struct mystruct
;
mystruct m;
int len = sizeof(m);
std::cout << len << std::endl;
// 輸出 是 12 ,(每個int的長度是4)
myclass::myclass()
myclass m;
int len = sizeof(m);
std::cout << len << std::endl;
// 輸出 是 1 ,(空類的長度是1)
std::string str="123456789";
int len = sizeof(str);
std::cout << len << std::endl;
// 輸出是 28
在使用vs2015的32位debug構建中,sizeof(std::string)返回28;在64位debug構建中,得到40;在32位release構建中,得到24,在64位release構建中,得到32。
這是因為std::string的內部表示隨不同的構建選項而變化:例如,除錯構建通常包含額外的機制以幫助發現bug,這會增加表示的大小;此外,在64位構建中,指標更大,所以大小相對32位構建的要大點。
std::string str="123456789";
std::cout << str.length() << std::endl;
// 輸出是 9
輸出是 字串的長度
struct mystruct
;
按照上面的方式定義結構體,在網路傳輸中,由於str長度的不確定,在解析的時候,會出現問題。
所以要使用定常的資料型別比如
struct mystruct
;
網路常用的資料結構
套接字相關的資料型別 sockaddr和sockaddr in sockaddr用來儲存乙個套接字,定義如下 struct sockaddr sockaddr in的功能與socdaddr相同 struct sockaddr in struct in addr struct hostent geth...
資料的網路傳輸
一 資料傳送過程 從主機進入線路 1 應用程式首先得將需要傳送到資料寫入該程序的記憶體位址空間中 2 應用程式通過系統函式庫介面 比如send函式 向核心發出系統呼叫,系統核心將這些資料從使用者態記憶體區複製到由核心維護的一段稱為核心緩衝區的記憶體位址空間 3 當資料寫入核心緩衝區後,核心會通知網絡...
在網路中傳輸結構體
在網路中傳輸結構體時,需要注意以下兩點 1 要消除間隙,避免cpu字長不一樣,造成錯位 2 要轉換位元組序,避免cpu位元組序不一樣造成錯誤。可以通過以下方式封裝解封裝訊息。xx msg.h ifndef xx msg h define xx msg h define xx msg hdr len ...