处理网络程序的字节序,是件非常简单的事,但每次使用时,都显示调用ntohl之类的转换,仍是一件麻烦的事。怎样做更简单了?


 
只需要定义出各种网络字节序的类型即可,而这些类型和主机字节序兼容。标准的网络字节序是大字节序,在当今小字节序横行的时代,建议以小字节序作为网络字节序,只要通讯双方约定好,效果是一样的,但会省去很多转换,节省了CPU。

 
在定义用于网络通讯的struct时,就可应用网络字节序类型了,一切暗箱操作,对使用者透明,用起来就简单了,下面举个例:

 
struct Int16 // 实际操作时,可以定义成模板类,这样不用为每一个类型都去写一片了
{
public:
Int16()
:_m(0)
{
}

 
Int16(int16_t m)
{
// 将m转换成网络字节序,这里网络字节序可能是小字节序,也可能是大字节序,由编译宏控制
_m = f(m);
}

 
Int16& operator =(int16_t m)
{
_m = f(m);
}

 
operator int16_t() const
{
return f(_m) ; // 转回成主机字节序
}

 
private:
int16_t _m;
};

 
消息定义变成:
#pragma pack(4)
struct Message
{
Int16 a1;
Int16 a2;
Int32 b;
Int32 c;
};
#pragma pack()

 
Message* msg = new Message;
msg->a1 = x;
msg->a2 = y;
msg->b = z;
msg->c = 0;

 
// 不用做字节序转换了
socket->send(msg, sizeof(Message));

 
Message msg;
socket->recv(&msg, sizeof(Message));
int16_t a1 = msg.a1;

转载于:https://blog.51cto.com/mooon/909859

简约的网络字节序处理相关推荐

  1. 网络字节序,主机字节序,地址转换函数

    #include "../apue.h" int main(void){ //验证当前平台属哪种字节序 unsigned int x=0x12345678; unsigned ch ...

  2. python3 网络编程 主机字节序 网络字节序 相互转换

    编写底层低层网络应用时,或许需要处理通过电缆在两台设备之间传送的低层数据.在这种操作中,需要把主机操作系统发出的数据转换成网络格式,或者做逆向转换,因为这两种数据的表示方式不一样. 1. 代码 # 主 ...

  3. 数据包头分析---网络字节序与主机字节序

    udp头部数据结构 struct udphdr {  __be16 source; //16位源端口号  __be16 dest;  //16位目的端口号  __be16 len;   //指udp首 ...

  4. 网络传输大端序_基于大端法、小端法以及网络字节序的深入理解

    关于字节序(大端法.小端法)的定义<UNXI网络编程>定义:术语"小端"和"大端"表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起 ...

  5. linux网络编程一:主机字节序与网络字节序的的判断

     linux网络编程一:主机字节序与网络字节序的的判断(1)现代CPU的累加器一次能装载至少4字节(32位),即一个整数.那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数值,这就是字节序问题 ...

  6. php 字节序,Linux_Linux中网络字节序和主机字节序,主机字节序就是我们平常说的 - phpStudy...

    Linux中网络字节序和主机字节序 主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序.Big-Endian和Littl ...

  7. java 网络序_Java使用网络字节序进行数据传输

    Java使用网络字节序进行数据传输 一.消息格式 采用udp协议,协议数据有 长度.设备名称.命令编号.消息体4个字段组成 字段 长度 设备名称 命令编号 消息体 长度 4字节 2字节 1字节 变长 ...

  8. 网络通信之 字节序转换原理与网络字节序、大端和小端模式

    一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...

  9. 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

     1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...

  10. 网络字节序与主机字节序的转换[转]

    不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序 这个叫做主机序  最常见的有两种 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节 ...

最新文章

  1. string转int 等(转)
  2. linux shell 删除文本 较长行
  3. vbs禁用任务管理器
  4. 集群(cluster)原理(转)
  5. 聚焦实战,架构升级!
  6. redis desktop manager_面试官:Redis分布式锁如何解决锁超时问题?
  7. 【今日CS 视觉论文速览】11 Dec 2018
  8. 傅里叶滤波音频文件(笔记05)
  9. android活动中的变量,在不同的活动中保持变量值Android Studio
  10. python免费网课-Python网课推荐——免费学习Python编程
  11. Luogu2543[AHOI2004]奇怪的字符串 (动态规划 LCS)
  12. 浅析SqlServer简单参数化模式下对sql语句自动参数化处理以及执行计划重用
  13. java开发环境有哪些_Java学习开发环境配置大全
  14. SVN 版本回退 命令行
  15. 用python分析《三国演义》中的社交网络
  16. 百度程序员猝死 是否过劳死引发争论
  17. 220218_110049-如何在Word文档中插入多个带有文件名的图片?
  18. mysql rls_各种类型RLS自适应滤波算法的C++实现
  19. Js逆向教程19-websocket介绍
  20. C语言——整数各位数字求和

热门文章

  1. 最小生成树算法(Prim和Kruskal)
  2. 如何优雅的开启mac远程控制
  3. 如何用EasyRecovery 快速找回误删的截图
  4. 如何在苹果 M1 上安装使用 FL Studio
  5. PhpStorm连接docker容器内的php XDebug进行断点调试
  6. PHP定义常量define和const的区别
  7. 2017.11.18
  8. 《Flume日志收集与MapReduce模式》一2.1 下载Flume
  9. The summary of Interview
  10. 第3/24周 区_SQL Server中管理空间的基本单位