zoukankan      html  css  js  c++  java
  • 简约的网络字节序处理

    实现下载:text.gif inttypes.txt   

    处理网络程序的字节序,是件非常简单的事,但每次使用时,都显示调用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;
  • 相关阅读:
    程序是怎样跑起来的 第三章
    C#4.5-4.7学习总结
    第二周学习总结
    程序是如何跑起来的 第二章
    第一章读后感
    师生关系读后感
    C#学习总结
    我与计算机
    读《程序怎样跑起来》第一章有感
    读师生关系有感
  • 原文地址:https://www.cnblogs.com/aquester/p/9891833.html
Copyright © 2011-2022 走看看