关于TCP通信程序中数据的传递格式
2014-02-24 14:57
357 查看
前言
在之前的回射程序中,实现了字符串的传递与回射。幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题。在客户端和服务器使用不同的字节序格式的情况下传递二进制数据,会导致异常。此外,客户和服务器表示整型的位数不同也可能导致传递整型异常。
一个典型的错误示例( 回射程序中客户端的事务函数 )
错误原因
无论是用结构体或者用整型作为数据载体,当通信程序用于不同体系的计算机时,都可能会出现问题( 比如整型位数,二进制数据的大小端规范 )。
解决方法
1. 把所有的数据都作为字符串传递则没有任何问题
2. 显式定义所支持数据类型的二进制格式( 位数,大端或小端字节序 )
在之前的回射程序中,实现了字符串的传递与回射。幸运的是,字符串的传递不用担心不同计算机类型的大小端匹配问题,然而,如果传递二进制数据,这就是一个要好好考虑的问题。在客户端和服务器使用不同的字节序格式的情况下传递二进制数据,会导致异常。此外,客户和服务器表示整型的位数不同也可能导致传递整型异常。
一个典型的错误示例( 回射程序中客户端的事务函数 )
#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. 显式定义所支持数据类型的二进制格式( 位数,大端或小端字节序 )
相关文章推荐
- 第十五篇:关于TCP通信程序中数据的传递格式
- tcp客户/服务器回射程序之三-----数据格式
- SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good
- 关于Android的assets资源使用,以及网络间的数据传递JSON格式处理
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 转 winfrom如何通过http来进行通信,并且通过传递json格式的数据可接受json格式的数据
- 【iOS】Socket/TCP 通信 发送 NSString 字符串格式数据
- winfrom如何通过http来进行通信,并且通过传递json格式的数据可接受json格式的数据
- 关于后台传递给extjs tree的数据的格式的问题
- 数据的传递:TCP/UDP数据格式
- 关于MyBatis一些小错误,元素内容必须由格式正确的字符数据或标记组成.
- 关于Intent传递数据
- 数据的传递:TCP的建立和关闭
- Python post 传递text格式参数(自己组装数据头)
- java 程序与其它进程的数据通信
- c# 关于WCF 接口参数 为 xml 格式的 字符串(string) 的 数据 处理
- 查看c程序中的数据存储格式&从底层理解数据的强制转化
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Windows平台TCP通信程序实现-基于MFC CSocket类
- 关于使用聚合数据汇率接口植入自己的程序问题