当前情况:我有一个Linux服务器(与陌生人聊天)设置,我对效率有疑问。存储套接字信息随机访问速度
目前我使用的地图在一个简单的管理类来配对两个陌生人:
int sockManager::set_pair(int me, int them) {
if (them != -1) {
pairs[me] = them;
pairs[them] = me;
return 1;
}
return -1;
}
int sockManager::get_pair(int me) {
return pairs[me];
}
void sockManager::add_single(int me) {
pairs[me] = -1;
}
void sockManager::remove_single(int me) {
if (pairs[me] != -1)
pairs[pairs[me]] = -1;
pairs.erase(me);
}
int sockManager::find_unconnected(int me) {
if (pairs[me] != -1)
return pairs[me];
for (iter = pairs.begin();iter!=pairs.end();iter++){
if (iter->second == -1 && iter->first != me)
return iter->first;
}
return -1;
}
int sockManager::get_size(){
return pairs.size();
}
我使用这个管理器类的原因是可扩展性。比如在这个时候,我想改变我发现两个客户端连接的方式。我想要有一个“需要连接”标记,并且有一个简单的线程可以持续运行并找到客户端进行连接,当客户端无法连接时,如果时间超过x秒,则发送它们一个有趣的说法或某事(让他们招待)我还需要确保客户端没有连接到别人使用相同的IP地址作为他们的...
这里的问题: 我使用一个映射来存储每个套接字,它是相应的合作伙伴。是否有另一种更快的方式来存储每个套接字和合作伙伴组合? (对于随机访问,就像查找int [套接字]与映射方法的速度一样)。 {是否使用结构数组作为我的最初问题,然后我意识到这将是愚蠢的...文件描述符每次涨不上去了1所以这将是完全无用认为阵列将加快东西}
主观(ISH)问题: 我想用来存储标志为每个连接,你认为最好也是最容易展开的方法是将地图对的值(与键相对)变成一个持有必要信息(伙伴套接字,连接标志,标志...)的结构,或者我应该制作另一个地图特别是国旗成员的价值?内存不会是一个问题。
三更坚实[& &略有无关]问题: 我使用的是FD_SET与select()函数,和我读过它与大量的FD的(我知道它可以处理的非常慢最大1024,但同样适用于poll())我将如何去实现基于事件的系统来监听来自用户的传入数据? (操作系统:Ubuntu的Linux)和它会更快?我压力测试了我的服务器,我可以在整个网络上处理几百个客户端,而用户端却没有明显的放缓。我想一次支持3k以上。
我想通了更多的问这个问题,实现了多少愚蠢的问题我要问不是东西了几个小时读了...
谢谢,我现在正在与libevent合作。 – ultifinitus 2011-05-05 13:41:37