• 第十五篇:关于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. 显式定义所支持数据类型的二进制格式( 位数,大端或小端字节序 )

  • 相关阅读:
    获取ocx运行路径的另一种方法
    使用D3D渲染YUV视频数据
    C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)
    ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
    解决Eclipse中的卡死现象
    Http请求头和响应头
    HTTP请求头与响应头
    centos7 Mariadb5.5升级到Mariadb10.2
    window下利用navicat访问Linux下的mariadb数据库
    在Linux上安装及配置MariaDB
  • 原文地址:https://www.cnblogs.com/muchen/p/6877263.html
Copyright © 2020-2023  润新知