2012-12-27 1 views
0

예를 들어, 얼마나 많은 클라이언트가 연결될 것인가는 모르겠지만, 어떤 수의 클라이언트가 일정 기간 (예 : 10 초) 동안 연결할 수 있기를 바랍니다. (이 연결의 수를 허용하지만 분명히, while 루프의 마지막 반복이 받아 전화를 떠나특정 기간 동안`accept()`를 사용하여 몇 개의 연결을 허용합니까?

unsigned int currentTime = (unsigned int)time(NULL); 
int session[100], sessionCount = 0; 

// accept connections for 10 seconds: 
while ((unsigned int)time(NULL) - currentTime < 10) { 
    session[sessionCount++] = accept(my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size); 
} 

) 계속에서 프로그램을 차단 :

는 지금은 이런 일이 .

어떻게이 문제를 해결할 수 있습니까?

답변

1

검사 서버 코드 here

의사 코드 :

당신은 차단하지 않고 동의를 안전하게 호출 할 경우 감지하는 타임 아웃 값 select 또는 poll를 사용하려면
listener thread: 
     while(1) 
     { 
     : 
     : 
     if(select(...)>0) 
     { 
     if(FD_SET(..)) 
        if(accept(...)) dispatch_msg_to_processing_thread; 
     } 
     : 
     : 
     } 

processing thread: process message. 
+0

흥미 롭군요. 스레드없이이 작업을 수행 할 수있는 방법이 있습니까? – trusktr

+0

예제는 바로 처리합니다. 왜 스레드를 피하고 싶습니까? –

+0

전에는 사용 해보지 않았지만 실감 나는 것을 느꼈습니다. : D @ selbie의 대답은 스레드를 사용하지 않고도 흥미 롭습니다. – trusktr

2

.

void mainloop() 
{ 
    time_t startTime = time(NULL); 
    time_t listenTime = 10; // 10 seconds, for example 
    time_t elapsed = 0; 

    elapsed = time(NULL) - startTime; 
    secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed); 
    while (secondsToWait > 0) 
    { 
     fd_set readset = {}; 
     FD_SET(my_sock_desc, &readset); 
     timeval waittime = {}; 
     waittime.tv_sec = secondsToWait; 
     int count = select(my_sock_desc+1, &readset, NULL, NULL, &waittime); 
     if (FD_ISSET(my_sock_desc, &readset)) 
     { 
      accept(my_sock_desc, (struct sockaddr *)&client_sock_addr, &sock_size); 
     } 

     elapsed = time(NULL) - startTime; 
     secondsToWait = (elapsed >= listenTime) ? 0 : (listenTime-elapsed); 
    } 
} 
+0

클라이언트가'connect()'를 호출 한 후에 만 ​​accept()가 호출된다는 것을 의미합니까? – trusktr

+0

예,'select()'는 리스닝 소켓에 대기중인 클라이언트 연결이 대기중인 것을보고합니다. –

+0

스레드가없는 연결을 기다리는 동안 다른 작업을 수행 할 수있는 방법이 있습니까? – trusktr

관련 문제