TCP,先调用close()的一方会进入TIME_WAIT状态
SO_REUSEADDR
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用
SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用
server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项
bool CSocketEx::Create(const int nAf, const int nSocketType, const int nProtocol, const int nTimeS, const int nTimeR)
{
if(m_hSocket != -1)
return false ;
m_hSocket = socket(nAf,nSocketType,nProtocol);
if (m_hSocket !=-1)
{
struct timeval tv;
tv.tv_usec = 0;
tv.tv_sec = nTimeS;
if (setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)) < 0)
return false;
tv.tv_sec = nTimeR;
if (setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
return false;
int option = 1;
if (setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option)) < 0)
return false;
return true ;
}
return false;
}