在網路中傳輸結構體時,需要注意以下兩點:
(1)要消除間隙,避免cpu字長不一樣,造成錯位;
(2)要轉換位元組序,避免cpu位元組序不一樣造成錯誤。
可以通過以下方式封裝解封裝訊息。
xx_msg.h
#ifndef xx_msg_h
#define xx_msg_h
#define xx_msg_hdr_len 8 /* 訊息頭部長度,包括type欄位和length欄位 */
#define xx_max_msg_len 1024 /* 最大訊息長度,只包括value欄位*/
#define xx_msg_encap_8bit(pbuff, value, encaplen) \
do \
\while(0)
#define xx_msg_encap_16bit(pbuff, value, encaplen) \
do \
\while(0)
#define xx_msg_encap_32bit(pbuff, value, encaplen) \
do \
\while(0)
#define xx_msg_encap_str(pbuff, pstr, strlen, encaplen) \
do \
\while(0)
#define xx_msg_decap_8bit(pbuff, value, decaplen) \
do \
\while(0)
#define xx_msg_decap_16bit(pbuff, value, decaplen) \
do \
\while(0)
#define xx_msg_decap_32bit(pbuff, value, decaplen) \
do \
\while(0)
#define xx_msg_decap_str(pbuff, pstr, strlen, decaplen) \
do \
\while(0)
typedef int (*xx_encap_msg_func_p)(unsigned char *pbuff, void *pmsg);
typedef int (*xx_decap_msg_func_p)(unsigned char *pbuff, void *pmsg);
typedef enum xxmsgtype
xx_msg_type_e;
typedef struct xxipaddr
u;}xx_ip_addr_s;
typedef struct xxamsg
xx_a_msg_s;
extern int xx_encapamsg(unsigned char *pbuff, xx_a_msg_s *pamsg);
extern int xx_decapamsg(unsigned char *pbuff, xx_a_msg_s *pamsg);
extern int xx_encapmsg(unsigned char *pbuff, int msgtype, void *pmsg);
extern int xx_decapmsg(unsigned char *pbuff, int msgtype, void *pmsg);
#endif
xx_msg.c
#include #include #include xx_encap_msg_func_p gxxencapmsgfunctbl[xx_msg_type_cnt] =
xx_decap_msg_func_p gdecapmsgfunctbl[xx_msg_type_cnt] =
int xx_encapamsg(unsigned char *pbuff, xx_a_msg_s *pamsg)
else
xx_msg_encap_32bit(pbuff, pamsg->a, encaplen);
xx_msg_encap_16bit(pbuff, pamsg->b, encaplen);
xx_msg_encap_str(pbuff, pamsg->c, sizeof(pamsg->c), encaplen);
return encaplen;
}int xx_decapamsg(unsigned char *pbuff, xx_a_msg_s *pamsg)
else
xx_msg_decap_32bit(pbuff, pamsg->a, encaplen);
xx_msg_decap_16bit(pbuff, pamsg->b, encaplen);
xx_msg_decap_str(pbuff, pamsg->c, sizeof(pamsg->c), encaplen);
return encaplen;
}int xx_encapmsg(unsigned char *pbuff, int msgtype, void *pmsg)
int xx_decapmsg(unsigned char *pbuff, int msgtype, void *pmsg)
C socket傳輸結構體
我遇到的問題是,接收的資料轉成結構體後,結構體讀取值不對,只有ret是對的,如下 int ret recv deviceinfo.sockclient,char recebuf sizeof recebuf 0 第二個引數使用強制型別,為乙個資料報 sendstcuct data send new ...
重要筆記 網路訊號在網線和集線器中傳輸
本文寫的是網路包由網絡卡發出後怎樣在網線和集線器中傳輸的過程。以下是個人學習筆記,記錄的是較為重要的部分。目錄 網絡卡如何將包轉換成電訊號 訊號在網線的傳輸過程中,能量會逐漸損失 雙絞 是為了抑制雜訊 集線器會將訊號傳送給所有連線在它上面的線路 從計算機傳送出來的網路包會通過集線器 路由器等裝置被 ...
在網路傳輸中加號變空格問題
http請求引數中英文 號是要進行url編碼的,因為在http請求引數中加號就是空格的替代字元 因為空格對於http協議規定的url來說是乙個非法字元 所以當你的請求引數 現了乙個加號,就會一律理解成乙個空格。解決的方法就是對加號進行編碼轉換,url編碼的方法是將需要轉換的字元,轉換成英文百分號加字...