tcp網路傳輸,資料型別問題解說

2021-07-02 02:13:17 字數 907 閱讀 6546

不管過程中是什麼資料型別,傳輸到傳送介面的資料必須是char *,並且最好過程中明確統計字串的長度。

packetlen=(16+cmdinfo.length())*sizeof(char);//對於單純的string或者qstring可以用c++自帶的取長度的函式取字串長度,如果是對於c的結構體等強制轉換成char*後,拼接成的字串,一定不要用自定義的函式取長度,必須過程中分段求和。

memcpy(cmdpacket,(char *)&dataheadinfo,16);

memcpy(cmdpacket+16,(char *)(cmdinfo.c_str()),cmdinfo.length());

特別是用過程語言開的。比如qt下,過程中可能用qstring,std::string,到最後都要轉換成char *

對於傳輸結構體型別的協議包頭,一定不要把結構體,先轉換成string,然後在連線上包體,這樣傳輸過去之後,包頭的長度已經不是你結構體的固定長度,在傳輸到string中時,string是根據你實際占用的長度,分配記憶體的。肯定小於你固定的結構體的長度。 不要

cheadinfo為c結構體

typedef    struct headstr

*pheadinfo,headinfo;//(6+1+1(補齊))+4+4

std::string pheadinfo(cheadinfo);

std::string cmdpacket=pheadinfo.c_str;

在把結構體強制轉換成char*後,其中多餘的空間可能用\0填充,所以你不應該用cout,或qdebug來列印字串,因為這樣你只能列印出截至第乙個\0之前的字元。

並且不要用c++自帶的.length(),或者.size.統計你的字元長度,這樣它也之後統計你第乙個\0之前的字元(有可能是你填充的位之前),這樣你就不可能傳送完所有的資料。

TCP網路傳輸「粘包」問題

原文出處 http www.ciw.com.cn 當前在網路傳輸應用中,廣泛採用的是tcp ip通訊協議及其標準的socket應用開發程式設計介面 api tcp ip傳輸層有兩個並列的協議 tcp和udp。其中tcp transport control protocol,傳輸控制協議 是面向連線的...

TCP網路傳輸 粘包 問題

解決tcp網路傳輸 粘包 問題http www.ciw.com.cn 當前在網路傳輸應用中,廣泛採用的是tcp ip通訊協議及其標準的socket應用開發程式設計介面 api tcp ip傳輸層有兩個並列的協議 tcp和udp。其中tcp transport control protocol,傳輸控...

Arduino 傳輸資料型別轉換

itoa 將整型值轉換為字串。ltoa 將長整型值轉換為字串。ultoa 將無符號長整型值轉換為字串。gcvt 將浮點型數轉換為字串,取四捨五入。ecvt 將雙精度浮點型值轉換為字串,轉換結果中不包含十進位制小數點。fcvt 指定位數為轉換精度,其餘同ecvt atof 將字串轉換為雙精度浮點型值。...