【发布时间】:2013-01-08 00:28:16
【问题描述】:
如何构造具有给定消息规范的请求消息,然后发送到服务器思想 c 套接字?二进制协议用于客户端和服务器通信。以下方法是否正确?
给定消息规范:
字段格式长度值 ------------ ------ ------ -------- 请求 ID Uint16 2 20 requestNum Uint16 2 100 requestTitle String 10 数据串 /****************** 方法一 ****************/ typedef 无符号短 uint16; 类型定义结构{ uint16 请求 ID [2]; uint16 requestNum [2]; 无符号字符请求标题[10]; }requestMsg; … 请求消息 rqMsg; memcpy(rqMsg.requesID, "\x0\x14", 2); //20 memcpy(rqMsg.requesNum, "\x0\x64", 2); //100 memcpy(rqMsg.requesTitle, "title01", 10); … 发送(sockfd, &rqMsg, sizeof(rqMsg), 0); /******************方法2 ****************/ 无符号字符 rqMsg[14]; memset(rqMsg, 0, 14); memcpy(rqMsg, "\x0\x14", 2); memcpy(rqMsg+2, "\x0\x64", 2); memcpy(rqMsg+4, "title01", 10); … 发送(袜子,&rqMsg,sizeof(rqMsg),0);【问题讨论】:
-
只有第二种方法是正确的,大家可以自己想想
memset这个调用的用处。 -
@KerrekSB 这并不完全正确。如果他的机器的字节序与协议的字节序匹配,并且如果他使用
pragma pack(1)作为结构,他可以获得正确的结果。 (好的,只要他从字段中删除数组大小)但不幸的是代码不是真正可移植的......
标签: c