1. 문제 상황
클라이언트에서 포트를 지정하여 소켓을 생성 후 연결 한다음, 연결을 끊고 다시 연결했을 때 소켓이 Close되지 않고 TIME_WAIT 상태로 남아 있어서 10048(WSAEADDRINUSE) 에러가 발생한다. 길면 2분 가까이 TIME_WAIT이 지속되므로 난감해진다. 그럴 때 SO_LINGER 옵션을 줘서 TIME_WAIT 상태로 남지 않고 바로 포트를 반환하도록 할 수 있다.
2. 소스
//먼저 소켓을 포트를 지정하여 Create 한다.
m_ConnectSocket.Create(atoi(m_strClientPort));
// 링거 구조체를 생성하고 onoff = 1을 하여 링거를 키고, linger의 타이머를 0초로 설정한다.
struct linger{
int l_onoff;
int l_linger;
};
struct linger _linger;
_linger.l_onoff = 1;
_linger.l_linger = 0;
// SetSockOpt로 Socket에 옵션을 부여한다.
BOOL bRetVal = m_ConnectSocket.SetSockOpt(SO_LINGER, &_linger, sizeof(_linger));
//서버와 연결한다.
m_ConnectSocket.Connect(m_strHostIP, atoi(m_strHostPort));
'Programming > C++' 카테고리의 다른 글
[c++] 릴리즈 빌드시 exe, pdb 파일 이름 변경 방법 (0) | 2021.11.03 |
---|---|
Visual Studio에서 검색이 안될 때 (0) | 2021.04.30 |
[MFC] 명령줄 인자, Argument 받아서 프로그램 실행하기 (0) | 2021.03.22 |
OSVERSIONINFO, 운영체제 정보를 가져오는 구조체 (0) | 2021.02.03 |