C++ SOCKET发送STRUCT结构体

来源:互联网 发布:阿哥阿妹-网络 编辑:程序博客网 时间:2024/05/20 11:32

要发送的结构体:
typedef struct Test
{
int aa;
char bb[100];
char cc[900];
}t_Test;

初始化要发送信息。对于字符串请用_snprintf方法
t_Test tt;
tt.aa=456;
_snprintf ( tt.bb, sizeof(tt.bb),
“Hello, ID Welcome to login” );
_snprintf ( tt.cc, sizeof(tt.cc),
“Adfadfasdfadfasdfadfasdfadfasd”);

发送信息
Sock.SendChunk(&tt,sizeof(t_Test),0);

————————————————————
服务器端:

int nRecvBytes = Receive ( szRecvBuffer, sizeof(szRecvBuffer) );
if (nRecvBytes>0)
{
t_Test tt;
memcpy(&tt,szRecvBuffer,nRecvBytes);
printf(“server收到数据aa=%d\nbb=%s\ncc=%s”,tt.aa,tt.bb,tt.cc);
}

需要注意的是这个方法发送的结构体大小一定不能超过你设定的缓存大小,超过了的话就会分成两次发送,到了服务器端就会出问题。比如缓存大小是1024B,结构体大小为1124B,服务器接收的时候会先收到1024B的信息,但是这个信息并不是完整的一个结构体,还有100B的内容将会在第二个包里面发送过来。到了服务器端需要组装,而照现在这种写法除非我们能在发送的时候智能标记让服务器端意识到内容大小超过1024,需要接收完后再组装结构体,不然就只有先发送一个包表示接下来的信息的类型和大小,服务器端收到信息后再进入组装处理程序分支。这个方法的极限缓存大小是1640B,再大就超过一个报文的大小了。

 

另外还有个很可行的方法,我还没实验过。

把struct串行化,就是变成二进制流,按位存储在char数组中,数组大小就是一个报文的缓存大小。数组的最后一位存放一个标记,表示后面还会有内容发送过来。这样服务器端接收信息直到接收到发送结束标记。最后把累计存下来的数据反串行化,就还原成了发送过来的struct了。  串行化我还能理解,反串行化我就没弄过了,不太懂

原创粉丝点击