본문
네트웍의 이상으로 일시적으로 네트웍이 안되는 상황에서
서버쪽에서 Send를 하고, client에서 recv 를 하는 상황이 되면.
서버쪽은 네트웍 이상으로 send가 fail이 나지만, client는 recv에서 네트웍 이상을 감지할 수 없어 무한정 대기 상태로 빠지게 된다.
이를 해결할 수 있는 방법은,
규모가 큰 소프트웨어에서는 비동기소켓을 사용하는 것이 일반적인 방법인 것 같다.
하지만, 테스트용도, 혹은 간단한 프로그램에서는 좀 오버스럽기도 하고, 귀찮기도 한데.
alarm signal을 사용하여 처리하는 방법도 있으나, 개인적으로는 가독성이 떨어져서 추천하진 않는다.
또 다른 방법이 소켓 옵션에서 RCVTIMEO, 즉, receive time out 값을 설정하는 방법이다.
간단하게 소켓 생성 이후 소켓에 아래와 같이 설정함으로써 일정시간동안 recv 함수에서 대기가 발생하는 경우 타임아웃으로 처리할 수 있다.
1 2 3 4 5 6 7 8 9 | // 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)); |
끝-.
'컴퓨터 이야기' 카테고리의 다른 글
x86 어셈블리 구문. (0) | 2014.02.27 |
---|---|
ubuntu package downgrade. (0) | 2014.02.27 |
ubuntu 64bit 13.10에서 32bit 바이너리 실행 방법. (1) | 2014.02.27 |
템플릿(template)을 활용한 객체 동적 생성 및 링크(?) (0) | 2014.02.12 |
리눅스 배포판 버전 확인. (0) | 2014.02.11 |