2011-05-05 5 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 [socket]과 map 메소드를 비교하는 속도와 비슷하다.) {쌍에 대한 구조체 배열을 사용하는 것이 나의 초기 질문 이었는지, 나는 그것이 바보 같을 것이라는 것을 깨달았다 ... 파일 기술자 이 배열}까지 일을 속도 것이라고 생각 완전히 쓸모없는 것, 그래서 한 각 시간을 가지 마세요

주관적 (틱) 질문 : 나는, 각 연결에 대한 플래그를 저장하고 싶은 당신이 생각하십니까 가장 쉽고 가장 쉽게 확장 할 수있는 방법은 맵 페어의 값을 필요한 정보 (파트너 소켓, 연결할 플래그, 플래그 ...)를 유지하는 구조체로 만들거나 다른 맵을 만들어야하는 것입니다 구체적으로 플래그 멤버를 값으로 사용합니까? 기억은 문제가되지 않습니다.

셋째 더 단단한 [& & 약간 관련이없는] 질문 : 나는 선택() 함수와 함께 FD_SET을 사용하고, 나는 그것이 FD의 (나는 그것이를 처리 할 수있어 많은 수의 매우 느린 읽었습니다 최대 1024 개이지만 poll()에도 동일하게 적용됨) 사용자로부터 들어오는 데이터를 수신 대기하는 이벤트 기반 시스템을 구현하려면 어떻게해야합니까? (OS : 우분투 리눅스) 그리고 얼마나 빨라지겠습니까? 나는 내 서버를 그대로 테스트했고 사용자 측에서 눈에 띄는 속도 저하없이 수백 대의 클라이언트를 네트워크에서 처리 할 수있었습니다. 한 번에 3k 이상을 지원하고 싶습니다.

나는 ... 질문을 내가 시간 동안 물건에 독서보다 물어 대해 얼마나 많은 바보 같은 질문을 실현하여 더 생각

답변

2

은 어떻게 이벤트를 구현 가겠어요 기반 시스템에서 사용자로부터 수신 데이터가 수신 대기 중입니까? (OS : 우분투 linux) 그리고 얼마나 빨라지겠습니까? 이므로 서버를 테스트 해본 결과 쪽에서 의 눈에 띄는 속도 저하가 발생하지 않고 네트워크에서 클라이언트 수십 백명의 을 처리 할 수 ​​있습니다. 한 번에 3k 이상 이상을 지원하고 싶습니다. 일반적으로

, libevent 또는 MTasker에 의해 제공으로 c10k problem 이벤트 처리 루프를 사용합니다 해결하기 위해 노력했습니다. 스레딩은 일반적으로 지나치게 번거 롭음이없이 수백 가지를 얻지 만 어느 시점에서는 메모리 사용량이 매우 제한적입니다.이벤트 기반 프로그래밍을 사용하면 일반적으로 서버를 수천 개까지 확장 할 수 있지만 많은 요인에 따라 다릅니다.

+0

고맙습니다. 지금 libevent로 작업하고 있습니다. – ultifinitus