處理網絡程式的位元組序,是件非常簡單的事,但每次使用時,都顯示調用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,如需轉載請自行聯系原作者