第十五篇:关于TCP通信程序中数据的传递格式

前言

       在之前的回射程序中,实现了字符串的传递与回射。幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题。在客户端和服务器使用不同的字节序格式的情况下传递二进制数据,会导致异常。此外,客户和服务器表示整型的位数不同也可能导致传递整型异常。

一个典型的错误示例( 回射程序中客户端的事务函数 )

 1 #include    "unp.h"
 2 
 3 struct args {
 4   long    arg1;
 5   long    arg2;
 6 };
 7 
 8 struct result {
 9   long    sum;
10 };
11 
12 void
13 str_cli(FILE *fp, int sockfd)
14 {
15     char            sendline[MAXLINE];
16     struct args        args;
17     struct result    result;
18 
19     while (Fgets(sendline, MAXLINE, fp) != NULL) {
20 
21         if (sscanf(sendline, "%ld%ld", &args.arg1, &args.arg2) != 2) {
22             printf("invalid input: %s", sendline);
23             continue;
24         }
25         /*
26          * 写入结构体( 二进制数据 )
27         */
28         Writen(sockfd, &args, sizeof(args));
29 
30         if (Readn(sockfd, &result, sizeof(result)) == 0)
31             err_quit("str_cli: server terminated prematurely");
32 
33         printf("%ld\n", result.sum);
34     }
35 }

错误原因

       无论是用结构体或者用整型作为数据载体,当通信程序用于不同体系的计算机时,都可能会出现问题( 比如整型位数,二进制数据的大小端规范 )。

解决方法

       1. 把所有的数据都作为字符串传递则没有任何问题

       2. 显式定义所支持数据类型的二进制格式( 位数,大端或小端字节序 )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值