找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3998|回复: 6

问个问题,可能很简单的

[复制链接]
发表于 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,那么我该怎么使用程序实现,谢谢
 楼主| 发表于 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);  //转换成主机字节顺序
 楼主| 发表于 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吗?
 楼主| 发表于 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));的大小也不一样啊
 楼主| 发表于 2008-4-29 10:25:06 | 显示全部楼层
是这样,这么写你的网络协议规定的。
nData+sizeof(shLen) 中nData是你的字符串的长度,因为你的协议头前面还有2个字节的字符串长度标记,
所以需再加上一个sizeof(shLen)。
这里不能使用strlen(szbuff)。因为szbuff前面有协议头,strlen的结果很可能是错误的,C语言的字符串是\0结尾,一般遇见网络字节中的这个协议头就结束了,所以发送结果是错误的。
 楼主| 发表于 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就失去了

是吗?
 楼主| 发表于 2008-4-29 10:25:23 | 显示全部楼层
对不起,刚才的回帖写错了,居然把htons和ntohs写反,代码也有bug。昏。已经改正。

的确不能用sprintf,要用memcpy复制就成了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:29 , Processed in 0.018658 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表