其协议定义是这样的
<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和其详细内容
谢谢
==========================================================================
<8>PASYSTEM,老外的意思是,2个字节存放整数,代表后面字符串的长度,2个字节后面紧跟对应长度的字符数
8作为整型数字,0x0008,这是short表示,在内存中低字节在前,高字节在后0x08,0x00注意这不是网络字节顺序,而是主机字节顺序
通常我们htons((unsigned short)8)转换之后就可以得到网络字节顺序
假设一个字符串10位ok,按照老外的要求那么前两个字节应该放入
BYTE buffer[10+2];
memset(buffer,0,sizeof(buffer));
buffer[0]=(BYTE)(htons((unsigned short)10)&0x00ff);//网络字节顺序的低字节
buffer[1]=(BYTE)((htons((unsigned short)10)&0xff00)>>8););//网络字节顺序的高字节
memmove(buffer+2,_T("abcdefghig"),_tcslen(_T("abcdefghig")));
这样缓冲区里的应该就是
0x00,0x0A,'a','b','c','d','e','f','g','h','i','g'
你就可send了
不过建议你定义个struct
typedef struct pkg
{
unsigned short len;
TCHAR str[MAXSIZE];
}PKG;
PKG tmp;
memset(tmp,0,sizeof(PKG));
tmp.len=htons(8);
memmove(tmp.str,_T("PASYSTEM"),_tcslen(_T("PASYSTEM")));
send(tmp...);
如果你接受到
PKG tmprecv;
memset(tmprecv,0,sizeof(PKG));
//此处假设是定长包
memmove(tmprecv,recvbuffer/*你接受到字节流*/,tmprecv);
tmprecv.len=ntohs(tmprecv.len);
//根据len取tmprecv.str总足够的字节数给一个字符串变量就可以了
以上memmove过程中没有检查目标缓冲区和源缓冲区的大小,因为假设包定长,且maxsize足够大
只是用来解释,具体应用根据实际情况可改为动态分配和大小检查