최상단

컨텐츠

동기 입출력 소켓 사용시 recv함수에서 무한정 대기 상태로 빠질 수 있는 문제점.

글 정보

Category
컴퓨터 이야기
2014. 5. 2. 12:05

본문


네트웍의 이상으로 일시적으로 네트웍이 안되는 상황에서

서버쪽에서 Send를 하고, client에서 recv 를 하는 상황이 되면.

서버쪽은 네트웍 이상으로 send가 fail이 나지만, client는 recv에서 네트웍 이상을 감지할 수 없어 무한정 대기 상태로 빠지게 된다.


이를 해결할 수 있는 방법은, 

규모가 큰 소프트웨어에서는 비동기소켓을 사용하는 것이 일반적인 방법인 것 같다.


하지만, 테스트용도, 혹은 간단한 프로그램에서는 좀 오버스럽기도 하고, 귀찮기도 한데.

alarm signal을 사용하여 처리하는 방법도 있으나, 개인적으로는 가독성이 떨어져서 추천하진 않는다.


또 다른 방법이 소켓 옵션에서 RCVTIMEO, 즉, receive time out 값을 설정하는 방법이다.

간단하게 소켓 생성 이후 소켓에 아래와 같이 설정함으로써 일정시간동안 recv 함수에서 대기가 발생하는 경우 타임아웃으로 처리할 수 있다.


// windows
     DWORD recvTimeout = 5000;  // 5초.
     setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&recvTimeout, sizeof(recvTimeout));

// linux
     timeval tv;
     tv.tv_sec  = 5;
     tv.tv_usec = 0;
     setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(timeval));


끝-.



트랙백과 댓글 여닫기

페이징

PREV NEXT

1 2 3 4 5 6 ··· 369

TOP