linux下send函数发送结构体
llinux下send函数发送结构体与发送字符串相似,只需在服务器端定义一个与客户端同类型的结构体即可。
客户端代码:
#include
#include
#include
#include
#include
#include
#include
int main(){
int sockfd;
int len;
struct sockaddr_in address;
int result;
//定义结构体
struct send_info {
char info_from[20]; //发送者ID
char info_to[20]; //接收者ID
int info_length; //发送的消息主体的长度
char info_content[1024]; //消息主体
};
struct send_info info1; //向服务器发送的结构体
struct send_info info2; //接收服务器传送结构体
memset(&info1,'\0',sizeof(struct send_info)); //清空缓存
/******************初始化结构体******************/
strcpy(info1.info_from,"abc");
strcpy(info1.info_to,"def");
info1.info_length=1024;
strcpy(info1.info_content,"this string is sended to the server!");
sockfd = socket (AF_INET, SOCK_STREAM, 0); //AF_UNIX为UNIX内部的文件系统套接字
/**************根据服务器的设置情况给这个套接字起个名字*************/
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");//表示本机
address.sin_port = htons(9734);//端口号
len = sizeof(address);
/*****客户端连接服务器,调用connect在一个未命名套接字和服务器的监听套接字之间建立一个连接*****/
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1) {
perror("oops: client1");exit(1);
}
printf(
"client ID= % s\n server ID=%s\n information length =%d\n the content is %s\n", info1.info_from,
info1.info_to,info1.info_length,info1.info_content);
/******************对sockfd进行读写*****************/
send(sockfd, &info1,sizeof(struct send_info),0);//发送结构体至服务器
memset(&info2,'\0',sizeof(struct send_info)); //清空缓存,准备接收服务器发送回的结构体
recv(sockfd, &info2,sizeof(struct send_info),0);//接收
printf ("client ID=% s\n server ID=% s\n information length=% d\n the content is% s", info2.info_from,info2.info_to,
info2.info_length,info2.info_content);//显示结构体//
sleep(1);
close(sockfd);
exit(0);
}
服务器代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(){
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
/********************定义结构体**********************/
struct recv_info {
char info_from[20]; //发送者ID
char info_to[20]; //接收者ID
int info_length; //发送的消息主体的长度
char info_content[1024]; //消息主体
};
struct recv_info info1;
memset(&info1,'\0',sizeof(struct recv_info));//清空内存,防止出现乱码。
//为服务器创建一个命名套接字
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);//捆绑至规定地址和端口
//创建一个连接队列,开始等待客户的到来
listen(server_sockfd, 5);//队列5个字节长
while(1){
printf("server waiting...\n");
//接受一个连接,accept系统调用会等到有客户程序试图连接到由socket参数指定的套接字时才返回
//accept函数将创建一个新的套接字来与该客户进行通信,返回的是与之对应的文件描述符
client_len = sizeof(client_address);
//创建新的套接字描述符/*****对client_sockfd套接字上的客户进行读写*****/
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
recv(client_sockfd,&info1, sizeof(struct recv_info),0);//接收结构体
printf("client ID= %s\n server ID=%s\n information length =%d\n the content is %s\n", info1.info_from,info1.info_to,info1.info_length,info1.info_content);//显示结构体内容
send(client_sockfd,&info1, sizeof(struct recv_info),0);//发送回客户端
close(client_sockfd);
}
}