peakzhang 发表于 2008-4-29 10:24:30

问个问题,可能很简单的

请教一个问题,谢谢现在做一个项目,需要同老外的服务器做接口
其协议定义是这样的
<8>PASYSTEM
其中PASYSTEM表示字符串,而<8>表示的是PASYSTEM的长度
这里的<8>是两字节的网络字节序(短整形),它既不是string类型,也不是char类型
下面这句话是老外的原文
Please note that <8> is a 2 byte network byte order (short Integer). It is
>not a STRING or CHARACTER.
现在我的疑问是,我在写程序时,需要将<8>PASYSTEM发送给server,那么我该怎么格式化
<8>PASYSTEM呢?就是说,我要将<8>PASYSTEM以字符串的形式发送给server,但是其中<8>是两字节
的 网络字节序,该如何表示他呢?
假如我接收到了<8>PASYSTEM,我怎么样识别其中的两字节的字符串的长度8和其详细内容
谢谢

网络字节许的概念理解,但是不知道该如何使用程序实现下述功能
csdn中有人回复是short+string,那么我该怎么使用程序实现,谢谢

peakzhang 发表于 2008-4-29 10:24:41

很简单的,ntohs和htons转换一下刚才写了半天,提交失败,都没了,气死我了。

重写一下:

发送:
short shLen = nData;
shLen = htons(shLen); //网络字节转换
//用memcpy,不能用sprintf
memcpy(szBuff,&shLen,sizeof(shLen));
sprintf(szBuff+sizeof(shLen),"%s",szSend);

socket_stream.send(szBuff,nData+sizeof(shLen));

接收:

short shLen = 0;
memcpy(&shLen,szRecv,sizeof(shLen)); //把收取缓冲区的前面两个字节复制回来
shLen = ntohs(shLen);//转换成主机字节顺序

peakzhang 发表于 2008-4-29 10:24:48

有点疑问,socket_stream.send(szBuff,nData+sizeof(shLen));这里的发送数据的大小要使用nData+sizeof(shLen)吗?

还是使用socket_stream.send(szBuff,2+sizeof(shLen));其中的shLen不是占用两个byte吗?

peakzhang 发表于 2008-4-29 10:24:57

这里使用socket_stream.send(szBuff,strlen(szbuff));和

socket_stream.send(szBuff,nData+sizeof(shLen));的大小不一定一样啊

就是与

socket_stream.send(szBuff,2+sizeof(shLen));的大小也不一样啊

peakzhang 发表于 2008-4-29 10:25:06

是这样,这么写你的网络协议规定的。
nData+sizeof(shLen) 中nData是你的字符串的长度,因为你的协议头前面还有2个字节的字符串长度标记,
所以需再加上一个sizeof(shLen)。
这里不能使用strlen(szbuff)。因为szbuff前面有协议头,strlen的结果很可能是错误的,C语言的字符串是\0结尾,一般遇见网络字节中的这个协议头就结束了,所以发送结果是错误的。

peakzhang 发表于 2008-4-29 10:25:14

其实我的疑问主要在这里,网络字节序使用spritf转化成一个字符串的时候,会有点变化

比如

short shLen = 3;
shLen = ntohs(shLen); //网络字节转换
sprintf(szBuff,"%d%s",shLen,szSend);//szSend是需要发送的字符串

//这里转成了字符串后可能是“1111”+szSend,这样发送的字节数不是超过了网络字节序的大小--2了吗

当我在解析该字符串的时候,提取其前两个字节,那么不就成了11了吗?后面两位的11就失去了

是吗?

peakzhang 发表于 2008-4-29 10:25:23

对不起,刚才的回帖写错了,居然把htons和ntohs写反,代码也有bug。昏。已经改正。

的确不能用sprintf,要用memcpy复制就成了。
页: [1]
查看完整版本: 问个问题,可能很简单的