现状:我有一个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以上。
我通过提出这个问题并弄清楚我要提出多少愚蠢的问题,而不是读几个小时的东西,我想出了更多......
答案 0 :(得分:2)
我将如何实施 基于事件的系统来监听 来自用户的传入数据? (操作系统:ubuntu linux)和它会快多少? 我已经压力测试了我的服务器 我可以处理几百个 没有网络的网络客户端 用户的显着减速 侧。我想支持更多 一次3k。
通常,尝试解决c10k problem的人会使用libevent或MTasker提供的事件处理循环。线程通常会让您在数百人的情况下不会有太多麻烦,但在某些时候内存使用会受到非常严格的限制。基于事件的编程通常允许服务器扩展到数千个,但这取决于许多因素。