TCP 프로그래밍을 하다보면 잊지 말고 해줘야 할일이 좀비 세션에 대한 처리 이다.
좀비 세션은 서버나 클라이언트가 정상적으로 종료 하지 않았는데(보통 렌선이 뽑혔다거나, 방화벽에서 일부러 세션을 종료시켰다거나)도 불구하고 종료되어 서버나 클라이언트는 세션이 종료되었는지 모르는 상태(Close 이벤트를 못받는다.)의 세션을 말한다.
이러한 예외를 처리하기 위해 주기적으로 내가 살아있다고 신호를 보내줘야 하는데 이런 작업을 TCP 소켓에서 제공한다.
방법도 아주 간단다. 소켓의 옵션을 변경만 해주면 알어서 다 해준다. KEEPALIVE 에 대한 옵션은 두가지가 있다.
SIO_KEEPALIVE_VALS, SO_KEEPALIVE 이다. 이 두개의 옵션이 다른점은 SO_KEEPALIVE 옵션을 적용하면 시스템 레지스트리 값을 변경하므로 그 시스템의 모든 소켓의 KEEPALIVE 속성이 변경하게 된다. 그래서 이 옵션의 사용은 권장하지 않는다. SIO_KEEPALIVE_VALS 는 그와 달리 특정 SOCKET 에만 설정된다.
SO_KEEPALIVE 사용은 권장되지 않으므로 SIO_KEEPALIVE_VALS 간단한 샘플을 보자
#include <mstcpip.h>
tcp_keepalive tcpkl;
tcpkl.onoff = 1; // KEEPALIVE ON
tcpkl.keepalivetime = 1000; // 1초 마다 KEEPALIVE 신호를 보내겠다. (Default 는 2시간이다)
tcpkl.keepaliveinterval = 1000; // keepalive 신호를 보내고 응답이 없으면 1초마다 재 전송하겠다. (ms tcp 는 10회 재시도 한다)
WSAIoctl(SOCKET,
SIO_KEEPALIVE_VALS, &tcpkl, sizeof(tcp_keepalive),
0,0, &dwRet, NULL, NULL);
요렇게만 해주면 좀비세션이 되었을때 Close 나 Receive 이벤트를 받을수 있다.
% windows 2000 이상의 OS 에서만 동작한다. 참고
'programming' 카테고리의 다른 글
함수 포인터 (0) | 2010.11.02 |
---|---|
인터넷 브라우져의 Navigate 수행으로 로컬 파일 실행시키기 (0) | 2009.10.05 |
Visual Studio 2005 (VC++) 원격 디버깅 하기 (0) | 2009.04.07 |
VC80 배포 (DLLs + Manifest) (0) | 2009.04.06 |
64 bit 지원하기 (0) | 2009.04.03 |