當前情況:我有一個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