Friday, October 14, 2005

使struct sockaddr_in与 std::set,std::map等一起工作



最近在编写代码中遇有这样的需要,通过 ip,port 索引某类对象。
例如,
std::map<struct sockaddr_in, some_thing*> dict;

如何实现?
变通的办法不少,但我有了简单的办法。

只需要实现两个struct sockaddr_in 的操作符即可。说白了,就这么简单:

inline bool operator<(const struct sockaddr_in& x, const struct sockaddr_in&
y)
{
return x.sin_addr.s_addr < y.sin_addr.s_addr
|| (x.sin_addr.s_addr == y.sin_addr.s_addr && x.sin_port < y.sin_port
);
}

inline bool operator==(const struct sockaddr_in& x, const struct sockaddr_in& y)
{
return x.sin_addr.s_addr == y.sin_addr.s_addr && x.sin_port == y.sin_port;
}

就这么简单,甚至是没必要做 ntohl,ntohs 的转化。可以用了:

std::map<struct sockaddr_in, some_thing*> dict;
struct sockaddr_in sin1;
.......
struct sockaddr_in sin2;
.......

dict[sin1] = &some_thing1;
dict[sin2] = &some_thing2;

同理,给struct sockaddr_in再追加合适的接口(struct __gun_cxx::hash<struct sock
addr_in>),能使其与 __gnu_cxx::hash_set,__gnu_cxx::hash_map等一起工作。