转载自: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));
分享到:
相关推荐
跨平台进程间通信(IPC,Inter-Process Communication)是计算机技术中的一个重要概念,它允许不同进程之间共享数据、协调工作,实现系统资源的有效利用。在标题中提到的“跨平台进程间通信源码”可能是一个软件库...
高性能跨平台网络通信框架代码,支持linux,windows,macos 等操作系统,可以编译使用, 描述 - ***Server*** 基于IOCP / EPOLL通信模型,并结合缓存池、私有堆等技术实现高效内存管理,支持超大规模、高并发通信...
在发送(XMT)和接收(RCV)数据时,通信格式必须包括起始字符、指令类型、目标站地址、目标寄存器地址、读写字节数、要写入的数据、BCC码校验和结束字符等。其中BCC码用于校验数据的正确性,以确保数据在传输过程中...
《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...
文档中提出的研究是基于FDT技术,开发了一个OPC跨平台数据访问模型。这个模型利用FDT技术的核心优势来解决DCS系统中数据访问依赖于设备的现场总线类型、厂商和设备特点的问题。FDT技术的应用,使得在多平台DCS系统下...
基于源码的GDBus进程通信框架:跨平台、可靠且稳定的进程间通信解决方案,基于源码的GDBus进程通信框架:跨平台通信、守护进程与可靠通信程序解决方案,GDBus进程通信程序框架和源码 代码实现了进程间通信的基本框架,...
第2章介绍了wxWidgets的程序框架及其实现,第3章深入剖析了wxWidgets的事件处理机制,第4~11章详细讲述了wxWidgets的图形用户界面、数据结构及wxWidgets在图像与绘图、多媒体、打印处理、多线程、网络通信和数据库...
如何让基于不同平台的应用程序协同工作,实现OPC的跨平台通信,成为工业自动化中必须解决的问题。 实现OPC跨平台通信的方法 为了解决上述问题,研究者提出了三种方法来在Linux环境下开发OPC客户端,进而实现与...
跨平台网络通信与服务器开发框架;支持 HTTP/MQTT/Redis/Memcache/SMTP/PING/Beanstalk/handler socket 等网络通信协议;支持线程池、协程、进程池、非阻塞、触发器等多种服务器编程模型;支持 XML/JSON/MIME/BASE64...
STL则为C++提供了强大的数据结构和算法支持,它是跨平台项目中不可或缺的部分。 书中还强调了避免移植性陷阱的重要性,这些陷阱可能在不同平台间由于数据类型表示方式不同(如浮点数、char类型)或是数据序列化时...
通过这些知识点,你可以构建一个基础的跨平台串口通信程序,但实际项目中可能还需要考虑网络连接、安全性、性能优化等因素。这个"串口通信实例"项目很可能包含了上述部分或全部内容,通过学习和实践,你将能够实现...
好东西一定得分享,自己现阶段需要好好学习一下QT。C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF。好东西而且分数不贵!解压密码qt。
"个人编写西门子与三菱等多设备兼容上位机接口:跨平台解决工业网络通信与PLC毫秒级数据读取",上位机接口 此程序是个人编写 只支持西门子 后续增加三菱等设备 解决工业网络间的复杂的数据通信问题,解决多个独立程序...
Windows Communication Foundation(WCF)是Microsoft在.NET Framework 3.5框架下推出的一种新的编程模式和技术框架,它为开发人员提供了一种统一的方法来实现跨平台、跨进程的服务通信。WCF支持多种传输协议、消息...
跨平台数据同步的方法有多种,包括基于Socket通信的数据同步、基于组件化编程的数据同步、基于Intranet自动化工具的数据同步等。这些方法都有其优缺点,在选择数据同步方法时需要考虑到企业安全策略、数据同步的速度...
QT库是一种跨平台的C++开发框架,广泛用于创建图形用户界面和其他软件应用程序。在网络通信领域,QT提供了强大的网络编程接口,使得开发者可以轻松地构建客户端-服务器应用、实现TCP/IP通信、UDP广播以及HTTP、FTP等...
一款纯C实现的跨平台modbus协议通信库.zip一款纯C实现的跨平台modbus协议通信库.zip一款纯C实现的跨平台modbus协议通信库.zip一款纯C实现的跨平台modbus协议通信库.zip一款纯C实现的跨平台modbus协议通信库.zip一款...
综上所述,"C++ 跨平台 异步消息队列"项目涉及了C++多线程编程、同步机制、队列数据结构和跨平台兼容性等多个核心知识点。通过理解和掌握这些技术,开发者可以构建出更健壮、高效的并发应用程序。
基于GDBus的进程间通信框架与源码库:跨平台通信、守护进程开发利器,高可靠性与稳定性保障,GDBus进程通信程序框架和源码 代码实现了进程间通信的基本框架,方便应用于不同平台间进程通信。 基于此代码可以轻松开发...