转载自:http://bbs.kylin-linux.com/htm_data/10/1005/339.html
网络通信通常分为基于数据结构的和基于流的。HTTP协议就是后者的一个例子。
有时为了提高程序的处理速度和数据处理的方便,会使用基于数据结构的通信(不需要对流进行解析)。但是,当需要在多平台间进行通信时,基于数据结构的通信,往往要十分注意以下几个方面:
[1] 字节序
[2] 变量长度
[3] 内存对齐
在常见的系统架构中(Linux X86,Windows),非单字节长度的变量类型,都是低字节在前,而在某些特定系统中,如Soalris Sparc平台,高字节在前。如果在发送数据前不进行处理,那么由Linux X86发向Soalris Sparc平台的数据值,势必会有极大的偏差,进而程序运行过程中无法出现预计的正常结果,更严重时,会导致段错误。
对于此种情况,我们往往使用同一的字节序。在系统中,有ntohXXX(), htonXXX()等函数,负责将数据在网络字节序和本地字节序之间转换。虽然每种系统的本地字节序不同,但是对于所有系统来说,网络字节序是固定的-----高字节在前。所以,可以以网络字节序为通信的标准,发送前,数据都转换为网络字节序。
转换的过程,也建议使用ntohXXX(), htonXXX()等标准函数,这样代码可以轻松地在各平台间进行移植(像通信这种很少依赖系统API的代码,做成通用版本是不错的选择)。
变量的长度,在不同的系统之间会有差别,如同是Linux2.6.18的平台,在64位系统中,指针的长度为8个字节,而在32位系统中,指针又是4个字节的长度---此处只是举个例子,很少有人会将指针作为数据发送出去。下面是我整理的在64位Linux系统和32位Linux系统中,几种常见C语言变量的长度:
short int long long long ptr time_t
32位 2 4 4 8 4 4
64位 2 4 8 8 8 8
在定义通信用的结构体时,应该考虑使用定常的数据类型,如uint32_t,4字节的固定长度,并且这属于标准C库(C99),在各系统中都可使用。
内存对齐的问题,也与系统是64位还是32位有关。如果你手头有32位和64位系统,不妨写个简单的程序测试一下,你就会看到同一个结构体,即便使用了定常的数据类型,在不同系统中的大小是不同的。对齐往往是以4字节或8字节为准的,只要你写的测试程序,变量所占空间没有对齐到4或8的倍数即可,举个简单的测试用的结构体的例子吧:
struct student
{
char name[7];
uint32_t id;
char subject[5];
};
在每个系统上看下这个结构体的长度吧。
内存对齐,往往是由编译器来做的,如果你使用的是gcc,可以在定义变量时,添加__attribute__,来决定是否使用内存对齐,或是内存对齐到几个字节,以上面的结构体为例:
1)到4字节,同样可指定对齐到8字节。
struct student
{
char name[7];
uint32_t id;
char subject[5];
} __attribute__ ((aligned(4)));
2)不对齐,结构体的长度,就是各个变量长度的和
struct student
{
char name[7];
uint32_t id;
char subject[5];
} __attribute__ ((packed));
分享到:
相关推荐
基于.net6的跨平台物联网网关 基于.net6的跨平台物联网网关 基于.net6的跨平台物联网网关 基于.net6的跨平台物联网网关 基于.net6的跨平台物联网网关 基于.net6的跨平台物联网网关 基于.net6的跨平台...
基于QT的跨平台应用软件集合,包含嵌入式 Linux 平台控制软件;TCP 通信的客户端和服务端;桌面平台数据读取程序。 基于QT的跨平台应用软件集合,包含嵌入式 Linux 平台控制软件;TCP 通信的客户端和服务端;桌面...
高性能跨平台网络通信框架代码,支持linux,windows,macos 等操作系统,可以编译使用, 描述 - ***Server*** 基于IOCP / EPOLL通信模型,并结合缓存池、私有堆等技术实现高效内存管理,支持超大规模、高并发通信...
基于FDT的OPC跨平台数据访问研究pdf,基于FDT的OPC跨平台数据访问研究
跨平台进程间通信解决方案,可以向多个进程发送消息,windows/linux上实测通过 ...
SwiftGraph:纯 Swift 实现跨平台的图数据结构
第2章介绍了wxWidgets的程序框架及其实现,第3章深入剖析了wxWidgets的事件处理机制,第4~11章详细讲述了wxWidgets的图形用户界面、数据结构及wxWidgets在图像与绘图、多媒体、打印处理、多线程、网络通信和数据库...
socket 跨平台通信一端是Linux 一端是windows
“面向服务架构(SOA)的跨平台数据交换与搜索”系统(简称IDB)在模仿大脑记忆的基础上设计出了智能的“准一维数据结构”,并利用“准一维数据结构” 从根本上解决了异构数据源问题。IDB系统实现了“安装一次,处处可...
跨平台网络通信与服务器开发框架;支持 HTTP/MQTT/Redis/Memcache/SMTP/PING/Beanstalk/handler socket 等网络通信协议;支持线程池、协程、进程池、非阻塞、触发器等多种服务器编程模型;支持 XML/JSON/MIME/BASE64...
C++设计模式--基于Qt4开源跨平台开发框架
IDB),可以实现跨平台数据交换和搜索,能够发送、接收各种异构的数据并把收到的数据直接存放到关系数据库中,使跨平台数据交换犹如收发电子邮件那样简单,只要有了对方的接口地址,就可以把任何结构的数据发送到...
因此基于Qt良好的跨平台特性,开发一个跨平台简易的串口调试助手,满足基本的串口调试需求。最后开源分享出来。目前实现的功能有: 1. 搜索串口设备; 2. ASCII/HEX接收; 3. 接收数据保存到txt; 4. ASCII/HEX...
本资源是关于C++百万并发网络通信引擎的详尽教程,涵盖了Socket编程、全栈开发和跨平台部署等方面的内容。通过全面介绍并发网络通信引擎的架构设计和实现技术,本资源旨在帮助开发者深入理解网络通信原理,掌握高...
基于web service的三层跨平台数据库的设计与实现,严商,,分析了三层跨平台数据库系统所面临的异构平台通信,代码可重用性及软件互操作性问题。介绍了web service技术的特点,提出如何利用该技��
基于C/C++ Qt5开发跨平台桌面程序应用,使用TCP/IP、UDP/IP网络协议,B/S、C/S架构,实现上下位机、客户端与服务器之间网络通信调试。 本项目为Qt5项目开发源码,未打包成桌面软件,内含完整UI、图标和源码、学习...
ACE提供丰富的C++ wrapper facades, 以及可跨平台执行通信软件的基本任务的框架对象。ACE提供的基本任务包括事件分离与事件处理的分发, 信号量处理,服务初始化 , 进程间通信, 共享内存管理, 消息路由, 分布式服务的...
数据库同步工具,支持各种数据库类型跨平台性良好! 数据库同步工具,支持各种数据库类型跨平台性良好!
好东西一定得分享,自己现阶段需要好好学习一下QT。C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF。好东西而且分数不贵!解压密码qt。