如何用给定的消息规范构造请求消息,然后发送给服务器认为c socket?客户端和服务器通信采用二进制协议。以下方法是否正确?用二进制协议发送多字段消息的C socket
给定的消息规格:
Field Fomat Length values ------------ ------ ------ -------- requesID Uint16 2 20 requestNum Uint16 2 100 requestTitle String 10 data sring
/************** approach 1 ****************/ typedef unsigned short uint16; typedef struct { uint16 requesID [2]; uint16 requestNum [2]; unsigned char requestTitle [10]; }requesMsg; … requesMsg rqMsg; memcpy(rqMsg.requesID, "\x0\x14", 2); //20 memcpy(rqMsg.requesNum, "\x0\x64", 2); //100 memcpy(rqMsg.requesTitle, "title01 ", 10); … send(sockfd, &rqMsg, sizeof(rqMsg), 0); /************** approach 2 ****************/ unsigned char rqMsg[14]; memset(rqMsg, 0, 14); memcpy(rqMsg, "\x0\x14", 2); memcpy(rqMsg+2, "\x0\x64", 2); memcpy(rqMsg+4, "title01 ", 10); … send(sock, &rqMsg, sizeof(rqMsg), 0);
只有第二种方法是正确的,你可以自己考虑memset调用的效用。 –
@KerrekSB这并非完全正确。如果他的机器的字节顺序与协议的字节顺序匹配,并且他使用'pragma pack(1)'作为结构,他可以得到正确的结果。 (好吧,只要他从字段中删除数组大小)但不幸的是,代码是不是真的便携式然后... – junix