zoukankan      html  css  js  c++  java
  • 关于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
    ", result.sum);
    34     }
    35 }

    错误原因

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

    解决方法

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

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

  • 相关阅读:
    在Fragment中保存WebView状态
    Code First下迁移数据库更改
    脚本解决.NET MVC按钮重复提交问题
    1.1C++入门 未完待续。。。
    0.0C语言重点问题回顾
    12F:数字变换
    12G:忍者道具
    12D:迷阵
    12C:未名冰场
    12B:要变多少次
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3564325.html
Copyright © 2011-2022 走看看