天天看點

簡約的網絡位元組序處理

處理網絡程式的位元組序,是件非常簡單的事,但每次使用時,都顯示調用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;

繼續閱讀