2-5 傳送結構化的網路訊息資料
阿新 • • 發佈:2021-01-14
技術標籤:C++百萬併發網路通訊C++學習
2-5 傳送結構化的網路訊息結構
文章目錄
0-前言
【C++百萬併發網路通訊】系列是跟著B站up[夜作晝]的專案視訊做的筆記[C++ socket 高併發 select非同步 粘包 多執行緒 跨平臺 日誌 lua windows linux]。
希望能通過部落格的方式不斷堅持學習,也希望偶然間看到這篇部落格的你也能一起加油!
筆記目錄:【C++百萬併發網路通訊-筆記目錄】
1-結構化訊息資料
在客戶端與服務端,使用字串作為訊息傳輸雖然方便理解,但是在傳遞大量資料時,字串的解析就是個問題,一般會選擇使用JSON、XML、自定義格式的字元資料形式來傳遞資料
本節使用Cpp中的結構體來傳遞簡易的資料資訊
struct DataPackage
{
int age;
char name[32];
};
注意:如果選擇結構體進行訊息傳輸,在服務端與客戶端應該使用相同的結構體,具體的變數名稱可以不一樣,但是變數型別(int、float、char等)必須保持一致,這是為了確保解析命令時的位元組順序一致。同時,還應該確保同一種變數型別在服務端與客戶端使用的位元組數應該是一樣的。
我們修改之前版本2-4 建立能持續處理請求的CS程式中的服務端關於【傳送資料】部分的程式,利用結構體Datapackage
傳遞訊息。注意,send()
函式第二個形參要求是const char*
//6 處理客戶端請求,按照請求向客戶端傳送資料
if (0 == strcmp(_recvBuf, "getInfo"))
{
DataPackage dp = { 20, "小強" };
//將結構體轉化為const char *傳輸
send(_csock, (const char*)&dp, sizeof(DataPackage), 0);
}
else
{
char msgBuf[] = "???";
send(_csock, msgBuf, strlen(msgBuf) + 1, 0);
}
相應的,需要在客戶端修改【接收資料】部分的程式,如下,需要注意的是結構體資訊在傳送時進行了強制型別轉換,在接收時需要轉換回來。但是這樣有個缺點,就是服務端傳送“???”命令時,在客戶端同樣會被轉換為結構體,這裡是一處小bug。
// 6 接收伺服器資訊 recv
char recvBuf[128] = {};//接收資料緩衝區
int nLen = recv(_sock, recvBuf, 128, 0);//recv()返回接收資料的長度
if (nLen > 0)
{
//將接收到的二進位制檔案簡易轉化
DataPackage* dp = (DataPackage*)recvBuf;
cout << "接收到資料:年齡=" << dp->age << " 姓名="
<< dp->name << endl;
}