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를 취소
이상 끝.