經過本人的分析與專案實戰,一種基於收發結構體的方案是非常可靠且方便的。
具體方法是,所有的結構體繼承自乙個結構體,stbase,而stbase的成員只有乙個整形的訊息id,將收到的訊息存到緩衝區後
(處理好粘包),將緩衝區強制轉換成stbase,通過id來判斷對應的業務訊息,再強制轉換成對應的結構體。
訊息的定義:
這裡處理乙個基結構體外,只寫了兩個業務結構體,
struct stbasemsg
};//使用者資訊結構體,包含使用者的賬號、密碼
const int msg_userinfo = 1000;
struct stuserinfo:public stbasemsg
};//使用者的聊天結構體
const int msg_chat = 1001;
struct stchat:public stbasemsg
void clear()
};
以下是偽**,主要展示怎麼用這樣的功能,其中senddata和nrecvdata是我基於send和recv封裝的方法,文末會提供原始碼。
客戶端:
**主要體現傳送結構體,
stuserinfo userinfo;
strcpy(userinfo.szusername,"test11");
strcpy(userinfo.szpassword,"123456");
//傳送使用者資訊到伺服器
//sock為套接字控制代碼,userinfo為傳送緩衝區指標char*,第三個引數是緩衝區大小
senddata(sock,(char*)&userinfo,sizeof(userinfo));
stchat chat;
cin>>chat.szcontent;
//傳送客戶端輸入的一段話到伺服器
senddata(sock,(char*)&chat,sizeof(chat));
伺服器:接受到訊息的處理方式,重點
char szbuff[1024*4];
memset(szbuff,0,sizeof(szbuff));
//接受資料
ret = nrecvdata(socketclient,szbuff,1024*4);
if(ret == socket_error)
return;
//轉換緩衝區
stbasemsg *base = (stbasemsg *)szbuff;
//根據nid來判斷業務邏輯
switch (base->nid)
return ret;
}/*\
說明:
傳送資料
引數:sock,套接字控制代碼
data,傳送緩衝區
maxlen,傳送緩衝區大小
返回值:
接受的真正長度
*/int senddata(socket sock,const char *data,int len)
return ret;
}
真正傳送的資料由前四個位元組的訊息頭,和訊息體組成,訊息頭描述了訊息體的長度。 基於ARM CPLD的多串列埠通訊協議轉換方案
多串列埠通訊協議轉換方案 應用背景 隨著網路經濟時代的到來,基於tcp ip協議的ip網的應用得到廣泛普及,利用網路資源可以實現裝置的網路接入,裝置聯網監控已經成為工業自動化的發展趨勢。恆頤多串列埠協議轉換方案可以實現將工業現場的傳統串列埠裝置接入ip網路,實現多個不同協議的串列埠裝置與乙太網進行雙...
tcp和udp通訊協議
tcp udp tcp與udp基本區別 1.基於連線與無連線 2.tcp要求系統資源較多,udp較少 3.udp程式結構較簡單 4.流模式 tcp 與資料報模式 udp 5.tcp保證資料正確性,udp可能丟包 6.tcp保證資料順序,udp不保證 udp應用場景 1.面向資料報方式 2.網路資料大...
TCP通訊協議(上)同步傳輸
直接上例子,學習資料來自net之美。服務端建立listener物件,客戶端建立client物件,服務端首先開始對本地埠監聽,客戶端傳送連線請求。當需要傳輸字串時,兩者均需要建立stream物件,將想說的話,寫在這片小紅葉上,小紅葉就飛到對方 了。using system using system.c...