socket结构体:Linux下Socket编程中用send发送结构体



Linux网络通信 Linux下多客户端聊天软件Software Linux设计 Linux send and recevie structure



最近在开发个Linux下聊天软件Software好久没有做C语言开发了感觉到很多东西已经生疏了这下又碰到用Socket传递结构体问题google了发现也有不少朋友遇到同样问题所以就打算写出自己解决办法跟大家分享


Socket中send可以发送但不能直接发送结构体因此在发送端先把结构体转成然后用send发送在接收端recv再转换成原先结构体这个就是解决问题主要思路实现中要注意问题在下文阐述


为了客户端的间能够互相通信实现私聊我采用服务器转发方式因此用户发送每条消息中除了消息主体外还必须包含有发送者、接收者ID等信息如此采用结构体便是最佳办法了我定义结构体如下:

struct send_info

{

char info_from[20]; //发送者ID

char info_to[20]; //接收者ID

info_length; //发送消息主体长度

char info_content[1024]; //消息主体

};


发送端主要代码(为了简洁介绍说明问题我把用户输入内容、长度等验证代码去掉了):


struct send_info info1; //定义结构体变量

prf("This is client,please input message:");

//从键盘读取用户输入数据并写入info1.info_content

mem(info1.info_content,0,(info1.info_content));//清空缓存Cache

info1.info_length=read(STDIN_FILENO,info1.info_content,1024) - 1;//读取用户输入数据





mem(snd_buf,0,1024);//清空发送缓存Cache不清空话可能导致接收时产生乱码
//或者如果本次发送内容少于上次snd_buf中会包含有上次内容




memcpy(snd_buf,&info1,(info1)); //结构体转换成

send(connect_fd,snd_buf,(snd_buf),0);//发送信息
接收端主要代码:



struct send_info clt; //定义结构体变量





mem(recv_buf,'z',1024);//清空缓存Cache
recv(fd,recv_buf,1024,0 );//读取数据



mem(&clt,0,(clt));//清空结构体
memcpy(&clt,recv_buf,(clt));//把接收到信息转换成结构体



clt.info_content[clt.info_length]='\0';
//消息内容结束没有这句可能导致消息乱码或输出异常
//有网友建议说传递结构体中尽量不要有类型字段估计就是串尾符定位问题




(clt.info_content) //判断接收内容并输出
prf("\nclt.info_from is %s\nclt.info_to is %s\nclt.info_content is%s\nclt.info_length is %d\n",clt.info_from,clt.info_to,clt.info_content,clt.info_length);

//至此结构体发送和接收已经顺利结束了
Tags:  结构体 linux结构体 linux查找结构体 socket结构体

延伸阅读

最新评论

发表评论