前言

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

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

 #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) != ) {
printf("invalid input: %s", sendline);
continue;
}
/*
* 写入结构体( 二进制数据 )
*/
Writen(sockfd, &args, sizeof(args)); if (Readn(sockfd, &result, sizeof(result)) == )
err_quit("str_cli: server terminated prematurely"); printf("%ld\n", result.sum);
}
}

错误原因

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

解决方法

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

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

最新文章

  1. PostCSS深入学习: PostCSS和Sass、Stylus或LESS一起使用
  2. Android开发学习之路-提升用户体验小技巧
  3. POJ1584 判断多边形是否为凸多边形,并判断点到直线的距离
  4. c语言中三个点的解释 : variadic
  5. Union函数
  6. Manacher算法 - 求最长回文串的利器
  7. jQuery对象和javascript对象互换
  8. ubuntu忘记密码,忘记root密码的解决方法
  9. Maven Spring JUnit 在Maven Clean Install时报
  10. PAAS平台7×24小时可用性应用设计
  11. UIBarButtonItem 小记边
  12. Node.js之使用Buffer类处理二进制数据
  13. 解决由于VNC日志导致服务器磁盘100%
  14. xamarin android 在代码中如何设置文本颜色
  15. 20164301 Exp4 恶意代码分析
  16. orz gzy
  17. 在Asp.Net Core中使用中间件保护非公开文件
  18. GUI库之认识Tkinter(一)
  19. Linux下使用date命令查看和修改时间
  20. HBase的几个实示例

热门文章

  1. 洛谷P1120 小木棍(sticks数据加强版)
  2. .net IntPtr ==interoperable pointer
  3. 【Eclpise】Eclipse中Tomcat启动失败或者是重启失败
  4. linux内核中打印栈回溯信息 - dump_stack()函数分析【转】
  5. php转换字符编码为utf-8
  6. Codechef Eugene and big number(矩阵快速幂)
  7. Nginx三种模式的虚拟主机(附Apache基于域名的虚拟主机)
  8. Css Position定位(简易版本)
  9. zerorpc的安装
  10. HDOJ1071