2011-05-05 27 views
1

当前情况:我有一个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以上。

我想通了更多的问这个问题,实现了多少愚蠢的问题我要问不是东西了几个小时读了...

回答

2

我怎么会去实现一个 事件基于系统来监听用户输入的数据 ? (操作系统:Ubuntu的 Linux),它会多快? 我已经强调测试了我的服务器,因为它是 ,我可以在网络上处理几百个客户端 ,而用户的 端没有 明显减速。我一次最多支持 3k。

通常情况下,人们试图解决c10k problem将使用一个事件处理循环由libeventMTasker提供。线程通常会让你处于低数百位而没有太多麻烦,但是在某些时候内存使用会变得非常严格。基于事件的编程通常可以让服务器扩展到数千个,但这取决于很多因素。

+0

谢谢,我现在正在与libevent合作。 – ultifinitus 2011-05-05 13:41:37