注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

socket发送结构体--不使用封包拆包  

2017-05-20 11:07:18|  分类: UNIX网络编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
socket通讯中传输struct怎么办,第一我们想到的肯定是对struct进行封包和拆包,封包和拆包是为了防止粘包的发生,即在发送struct的前面加一个4字节的变量,该变量表示要发送struct的长度(以字节为单位计算),并且在发送端我们还要对每个struct的成员进行单独封包,并转换成网络字节序;在接收端首先接收4个字节,读取出该次通信所要接受的长度,再对每个struct的成员进行单独拆包,并转换成主机字节序,有多少个成员,那么就需要进行多少次的封包和拆包,这个过程看起来有点繁琐,其实这是很规范的写法。
这里有一种偷懒的做法,既然socket中通讯的是字节流,而char的单位也是字节,我何不把struct中的每个数据转为char进行传输呢?只需要在接收端再按照固定的格式把接收到的数据进行内存拷贝至struct中。示例如下:
发送端:
typedef struct Send_data
{
char c;
short s;
int n;
double d;
char arr[10];
}SENDDATA;
SENDDATA oData;
oData.c = '1';
oData.s = 10;
oData.n = 100;
oData.d = 1.2f;
strcpy(oData.arr, "mihooke");
send(sockWorker, (char*)&oData, sizeof(oData), 0);

接收端:
SENDDATA oData;
char cBigBuf[100] = {0};
recv(sockWorker, cBigBuf, 100, 0);
memcpy(&oData, cBigBuf, sizeof(oData));
char cPrintBuf[100] = {0};
sprintf(cPrintBuf, "c=%c,s=%d,n=%d,d=%f,arr=%s",oData.c,oData.s,oData.n,oData.d,oData.arr);
这时候oData中数据和发送端一样。
  评论这张
 
阅读(31)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017