본문 바로가기
Programming/C++

[MFC,CSocket] 클라이언트에서 포트 지정 후 재연결 시 10048 Error 발생 해결방법

by MVP 2022. 8. 10.

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));