天天看點

簡約的網絡位元組序處理

處理網絡程式的位元組序,是件非常簡單的事,但每次使用時,都顯示調用ntohl之類的轉換,仍是一件麻煩的事。怎樣做更簡單了?

隻需要定義出各種網絡位元組序的類型即可,而這些類型和主機位元組序相容。标準的網絡位元組序是大位元組序,在當今小位元組序橫行的時代,建議以小位元組序作為網絡位元組序,隻要通訊雙方約定好,效果是一樣的,但會省去很多轉換,節省了CPU。

在定義用于網絡通訊的struct時,就可應用網絡位元組序類型了,一切暗箱操作,對使用者透明,用起來就簡單了,下面舉個例:

struct Int16 // 實際操作時,可以定義成模闆類,這樣不用為每一個類型都去寫一片了

{

public:

Int16()

:_m(0)

}

Int16(int16_t m)

// 将m轉換成網絡位元組序,這裡網絡位元組序可能是小位元組序,也可能是大位元組序,由編譯宏控制

_m = f(m);

Int16& operator =(int16_t 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;

<a href="http://down.51cto.com/data/2360892" target="_blank">附件:http://down.51cto.com/data/2360892</a>

    本文轉自eyjian 51CTO部落格,原文連結:http://blog.51cto.com/mooon/909859,如需轉載請自行聯系原作者

下一篇: github配置

繼續閱讀