2011-10-27 2 views
1

C++로 작성된 서버에서 간단한 로그인에 대한 시간 제한을 쓰고 있습니다. 음,이 코드입니다 :C++에서 로그인에 대한 시간 초과를 설정하는 방법은 무엇입니까?

char username[this->BUFSIZE]; 
    clean(username); 
    char password[this->BUFSIZE]; 
    clean(password); 
    send(client_fd, "USER", 4, 0); 

    //Start timer 
    time_t end,start; 
    double dif; 
    time (&start); 

    recv(client_fd,username,BUFSIZE,0); 
    send(client_fd, "PASS", 4, 0); 
    recv(client_fd,password,BUFSIZE,0); 

    //End timer 
    time (&end); 
    dif = difftime (end,start); 
      //If dif>10 seconds disconnect the client. 
    if(dif>10) 
     close(client_fd); 

좋아 잘 작동하지만, 단지 문제가 있습니다 : 단절은 클라이언트 측 입력 사용자 + 비밀번호 경우에만 발생합니다. 내 목표는 타이머가 클라이언트가 로그인을했는지 여부와 관계없이 10 초에 독립적으로 연결을 닫아야한다는 것입니다.

가능합니까? 감사합니다.

+0

'하우스 키핑'스레드가 필요하고 백그라운드를 실행하며 사용자 작업과 상관없이 세션을 확인하고 무효화하는 것처럼 들립니다. – trojanfoe

답변

0

신호 - SIGALRM을 사용하고 recv을 입력하기 전에이를 설정하고 연결을 닫을 때 트리거합니다.

는 또한 당신은 client_fd에 데이터를 기다리는 select()을 사용할 수있는 등 타이머

2

를 제공 할 것 같은 ASIO로 전체 지방 프레임 워크를 사용합니다. select은 시간 초과 값을 지원하며 시간 초과가 발생하면 0을 반환합니다. 데이터가 준비되면 select은 보류중인 데이터가있는 설명자의 수를 반환합니다.

1

소켓 옵션 SO_RCVTIMEOtimeval 구조로 설정할 수도 있습니다. 이로 인해 제한 시간이 경과하면 recv가 리턴됩니다.

관련 문제