• 简约的网络字节序处理


    实现下载: 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;
  • 相关阅读:
    Google Map API使用详解(三)——Google Map基本常识(上)
    Google Map API使用详解(十)——使用JavaScript创建地图详解(上)
    sethc.exe
    taobao_java
    "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义 错误
    some Content
    变参 C++ 转帖
    阅读大型程序你得到什么
    一些模块
    a common jsp
  • 原文地址:https://www.cnblogs.com/aquester/p/9892022.html
Copyright © 2020-2023  润新知