`
fanrey
  • 浏览: 255015 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转载】跨平台时基于数据结构的网络通信

 
阅读更多
转载自: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));

分享到:
评论

相关推荐

    跨平台socket网络通信c语言实现

    在IT领域,网络通信是核心部分之一,而跨平台的网络通信则更加重要,因为这允许不同的操作系统(如Windows和Linux)之间的数据交换。本文将深入探讨如何使用C语言实现跨平台的Socket网络通信,特别是在UDP协议下进行...

    基于.NET6的跨平台物联网

    基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨平台物联网基于.NET6的跨...

    跨平台进程间通信源码

    跨平台进程间通信(IPC,Inter-Process Communication)是计算机技术中的一个重要概念,它允许不同进程之间共享数据、协调工作,实现系统资源的有效利用。在标题中提到的“跨平台进程间通信源码”可能是一个软件库...

    高性能跨平台网络通信框架.rar

    高性能跨平台网络通信框架代码,支持linux,windows,macos 等操作系统,可以编译使用, 描述 - ***Server*** 基于IOCP / EPOLL通信模型,并结合缓存池、私有堆等技术实现高效内存管理,支持超大规模、高并发通信...

    基于FDT的OPC跨平台数据访问研究.pdf

    文档中提出的研究是基于FDT技术,开发了一个OPC跨平台数据访问模型。这个模型利用FDT技术的核心优势来解决DCS系统中数据访问依赖于设备的现场总线类型、厂商和设备特点的问题。FDT技术的应用,使得在多平台DCS系统下...

    wxWidgets跨平台程序开发

    第2章介绍了wxWidgets的程序框架及其实现,第3章深入剖析了wxWidgets的事件处理机制,第4~11章详细讲述了wxWidgets的图形用户界面、数据结构及wxWidgets在图像与绘图、多媒体、打印处理、多线程、网络通信和数据库...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    面向服务架构(SOA)的跨平台数据交换与搜索

    “面向服务架构(SOA)的跨平台数据交换与搜索”系统(简称IDB)在模仿大脑记忆的基础上设计出了智能的“准一维数据结构”,并利用“准一维数据结构” 从根本上解决了异构数据源问题。IDB系统实现了“安装一次,处处可...

    OPC 跨平台通信的实现方法

    如何让基于不同平台的应用程序协同工作,实现OPC的跨平台通信,成为工业自动化中必须解决的问题。 实现OPC跨平台通信的方法 为了解决上述问题,研究者提出了三种方法来在Linux环境下开发OPC客户端,进而实现与...

    跨平台串口通信实例(linux和windows)

    通过这些知识点,你可以构建一个基础的跨平台串口通信程序,但实际项目中可能还需要考虑网络连接、安全性、性能优化等因素。这个"串口通信实例"项目很可能包含了上述部分或全部内容,通过学习和实践,你将能够实现...

    一个跨平台的聊天工具

    【标题】:“一个跨平台的聊天工具”所涉及的知识点主要涵盖了软件开发的多个领域,尤其是跨平台应用程序的构建和网络通信技术。 首先,我们来理解“跨平台”的概念。跨平台意味着该聊天工具能够在不同的操作系统上...

    基于C#网络通信的实例源代码

    两者都是微软的开发平台,提供了大量的类库和服务,支持跨平台开发。.NET Core作为轻量级、高性能的框架,尤其适用于云和微服务架构。 压缩包中的"SERVER"可能代表服务器端的代码文件夹,里面可能包括了启动服务器...

    基于C-C++ Qt5开发跨平台桌面程序网络调试应用源码+项目说明.zip

    基于C/C++ Qt5开发跨平台桌面程序应用,使用TCP/IP、UDP/IP网络协议,B/S、C/S架构,实现上下位机、客户端与服务器之间网络通信调试。 本项目为Qt5项目开发源码,未打包成桌面软件,内含完整UI、图标和源码、学习...

    5C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF.zip

    好东西一定得分享,自己现阶段需要好好学习一下QT。C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF。好东西而且分数不贵!解压密码qt。

    企业安全策略下的跨平台数据同步--中英文翻译.doc

    跨平台数据同步的方法有多种,包括基于Socket通信的数据同步、基于组件化编程的数据同步、基于Intranet自动化工具的数据同步等。这些方法都有其优缺点,在选择数据同步方法时需要考虑到企业安全策略、数据同步的速度...

    C++ 跨平台 异步消息队列

    综上所述,"C++ 跨平台 异步消息队列"项目涉及了C++多线程编程、同步机制、队列数据结构和跨平台兼容性等多个核心知识点。通过理解和掌握这些技术,开发者可以构建出更健壮、高效的并发应用程序。

    跨平台的socket库,windows-linux-socket

    在IT行业中,网络编程是构建分布式系统和互联网应用程序的基础,而Socket编程是网络通信的核心。本文将深入探讨“跨平台的socket库,windows-linux-socket”这一主题,旨在帮助开发者理解如何在Windows和Linux操作...

    基于TCP的Qt网络通信

    在IT行业中,网络通信是构建分布式系统和应用程序的关键部分,而Qt库则提供了一套强大的工具,使得开发者能够轻松地实现在C++中基于TCP的网络通信。本篇将深入探讨"基于TCP的Qt网络通信"这一主题,结合提供的QT通信...

Global site tag (gtag.js) - Google Analytics