通信的数据格式
先说结论
一般分字符串形式和二进制形式两种. 由于大小端, 64/32位问题, 推荐使用字符串作为传输数据格式
字符串方式
主程序在[多线程的发送与接收]那一节
主要修改就是服务端接收到数据后,将字符串转换成数字进行相加,然后发回给客户端
void str_echo(int sockfd){
long arg1,arg2;
ssize_t n;
char line[MAXLINE];
for(;;){
if((n=read(sockfd,line,MAXLINE)) == 0)
return;
if((sscanf(line,"%ld%ld",&arg1,&arg2)) == 2)
snprintf(line,sizeof(line),"%ld\n",arg1+arg2);
else
snprintf(line,sizeof(line),"input error");
n=strlen(line);
writen(sockfd,line,n);
}
}
二进制方式
先加个头文件sum.h, 服务端与客户端都使用同一格式的结构
// sum.h
struct args{
long arg1;
long arg2;
};
struct result{
long sum;
};
客户端str_cli代码
void str_cli(FILE *fp,int sockfd){
char sendline[MAXLINE];
struct args args;
struct result result;
while(Fgets(sendline,MAXLINE,fp) != NULL){
if((sscanf(sendline,"%ld%ld",&args.arg1,&args.arg2)) != 2){
printf("invalid input: %s",sendline);
continue;
}
writen(sockfd,&args,sizeof(args));
if((readn(sockfd,&result,sizeof(result))) == 0)
err_quit("str_cli: server terminated permaturely");
printf("%ld\n",result.sum);
}
}
服务端str_echo代码
void str_echo(int sockfd){
ssize_t n;
struct args args;
struct result result;
for(;;){
if((n=readn(sockfd,&args,sizeof(args))) == 0)
return;
result.sum=args.arg1+args.arg2;
writen(sockfd,&result,sizeof(result));
}
}