通信的数据格式

先说结论

一般分字符串形式和二进制形式两种. 由于大小端, 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
",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
",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));
    }
}
原文地址:https://www.cnblogs.com/cfans1993/p/5883379.html