您的位置:首页 > 理论基础 > 计算机网络

关于TCP通信程序中数据的传递格式

2014-02-24 14:57 357 查看
前言

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

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

#include    "unp.h"

struct args {
long    arg1;
long    arg2;
};

struct result {
long    sum;
};

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 prematurely");

printf("%ld\n", result.sum);
}
}


错误原因

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

解决方法

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

  2. 显式定义所支持数据类型的二进制格式( 位数,大端或小端字节序 )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: