반응형



SO_RCVTIMEO, SO_SNDTIMEO를 이용한 블록킹 소켓에서의 타임아웃 지정

struct timeval tv_timeo = { 3, 500000 };  /* 3.5 second */

if( setsockopt( fd, SOL_SOCKET, SO_RCVTIMEO, &tv_timeo, sizeof( tv_timeo ) ) == -1 )
{

      /* error */

}

if( setsockopt( fd, SOL_SOCKET, SO_SNDTIMEO, &tv_timeo, sizeof( tv_timeo ) ) == -1 )
{

     /* error */

}

 

 

위의 예에서 보면 SO_RCVTIMEO와 SO_SNDTIMEO를 3.5초로 지정하였는데,

이후에 send(2)나 recv(2) 혹은 sendto(2), recvfrom(2)을 블록킹 모드로 사용하면


해당 시간 내에 데이터가 수신되지 않으면 에러로서 판단하고 -1을 리턴한다.

 

물론 errno는 EAGAIN( = EWOULDBLOCK )로 지정된다.

 

만일 리스너 소켓에 SO_RCVTIMEO를 지정하면,

accept(2) 호출시에 지정된 타임아웃 동안 새로운 접속이 없으면

recv(2)처럼 EAGAIN에러로 리턴된다.

 

출처: http://www.asdfjkl.pe.kr/tc/firebird/archive/200905

반응형
Posted by 공간사랑
,