http://blog.163.com/ming_yue_shi/blog/static/201723189201202945424424/
其基本思想是把结构体类型的数据以字符串的形式保存在缓存中,然后接收端再把接受的字符串转化成结构体类型的数据
其实现代码如下
发送端代码:
#include<string.h>
#include<string.h>
#include<stdio.h>
#include<errno.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
struct person{
char name[20];
int age;
float high;
};
int main()
{
struct person p1;
int sockfd,newfd,y,m;
struct sockaddr_in servaddr,cl;
char buffer[256];
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(1234);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(sockfd,7);
bzero(&p1,sizeof(p1));
p1.age=22;
p1.high=167;
strcpy(p1.name,"zhangsan");
bzero(buffer,sizeof(buffer));
memcpy(buffer,&p1,sizeof(p1));
while(1)
{
y=sizeof(cl);
if((newfd=accept(sockfd,(struct sockaddr *)&cl,&y))<0)
exit(1);
if(send(newfd,buffer,sizeof(p1),0)==-1){
perror("send");
close(newfd);
}
}
close(sockfd);
exit(0);
}
接收端代码
#include<sys/stat.h>
#include<string.h>
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 1234
#define SERVER_IP "127.0.0.1"
struct person{
char name[20];
int age;
float high;
};
int main()
{
struct person p2;
int s,y;
struct sockaddr_in addr;
char buffer[1024];
if((s=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit(1);
}
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=inet_addr(SERVER_IP);
if((connect(s,(struct sockaddr *)&addr,sizeof(addr)))<0)
{
perror("conect");
exit(1);
}
y=recv(s,buffer,sizeof(buffer),0);
buffer[y]='\0';
//printf("%s",buffer);
memcpy(&p2,buffer,sizeof(p2));
printf("%s\n",p2.name);
printf("%d\n",p2.age);
}