Socket에서 Connect Timeout 관리 하기  

http://blog.naver.com/jaebeom/100016553034
 
[질문]connect Timeout 시간을 줄이는 방법은?
 
[답변1]connect 함수를 호출하기 전에 NONBLOCK 옵션을 주세요
 
    org_flags = fcntl(sock, F_GETFL, 0);
    flags = org_flags | O_NONBLOCK;
    fcntl(sock, F_SETFL, flags);
 
    if (connect (sock, (struct sockaddr *)&saddr, sizeof (struct sockaddr_in)) < 0)
    {
        close( sock );
        return -1;
    }
 
    fcntl(sock, F_SETFL, org_flags);
 
이렇게 하면 바로 한번의 연결을 시도한 후 실패하면 바로 리턴 합니다
 
local(127.0.0.1)에 접속하는 경우는 이렇게 사용하면 되구요
외부에 연결하는 경우에는 select를 써서 약간 시간동안
연결을 기다리게 해 줄 수 있습니다.
 

[답변2]alarm interrupt 사용
 
오래전에 썼던 방법인데.. 기억은 가물가물..
함 테스트 해보세요~
 
대충이론은
몇초후에 스스로에게 interrupt를 걸게 하는 겁니다.
커넥트가 성공하면 interrupt걸게 해놨던거를 취소하구요
취소가 안되고 몇초가 지나면 인터럽트 걸려서 프로그램이 죽겠져
alarm 이라는 함수가 그 몇초후에 interrupt를 걸수 있게 해 준다고 합니다.
 
제 소스의 일부를 발췌합니다.
 
    signal(SIGALRM,sig_alarm);
    alarm(5); // 5초 후 스스로에게 interrupt를 건다.
 
    if( (n=connect(s, (struct sockaddr *) &sin, sizeof(sin))) < 0) {
        if(errno == EINTR) {
            errno = ETIMEDOUT;
            printf("was interrupted\n");
        }
        close(s);
        err_msg("Can't connect the server..");
    }
    alarm(0); // 이전 alarm request를 취소

이상 끝.

Posted by 공간사랑