存储套接字信息随机访问速度

时间:2011-05-05 02:56:17

标签: c++ select stl map

现状:我有一个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 [socket]和map方法的速度。) {对于对使用结构数组是否是我最初的问题,然后我意识到这将是愚蠢的...文件描述符每次都不会增加1,所以认为数组会加速事情是完全没用的向上}

主观(ish)问题: 我想为每个连接存储标志,你认为最好和最容易扩展的方法是将地图对的值(而不是键)放到一个包含必要信息的结构中(伙伴套接字,标记连接) ,标记为...)或者我应该使用标志成员作为值制作另一张地图?记忆不会成为问题。

第三更坚实[&&问题: 我正在使用带有select()函数的FD_Set,并且我已经阅读了大量FD的速度很慢(我知道它可以处理最多1024个,但同样适用于poll())我将如何进行实现基于事件的系统来监听来自用户的传入数据? (操作系统:ubuntu linux)它会有多快?我已经对我的服务器进行了压力测试,我可以在整个网络上处理数百个客户端,而用户方面没有明显的减速。我想一次支持3k以上。

我通过提出这个问题并弄清楚我要提出多少愚蠢的问题,而不是读几个小时的东西,我想出了更多......

1 个答案:

答案 0 :(得分:2)

  

我将如何实施   基于事件的系统来监听   来自用户的传入数据? (操作系统:ubuntu   linux)和它会快多少?   我已经压力测试了我的服务器   我可以处理几百个   没有网络的网络客户端   用户的显着减速   侧。我想支持更多   一次3k。

通常,尝试解决c10k problem的人会使用libeventMTasker提供的事件处理循环。线程通常会让您在数百人的情况下不会有太多麻烦,但在某些时候内存使用会受到非常严格的限制。基于事件的编程通常允许服务器扩展到数千个,但这取决于许多因素。