在libevent库中有包裹函数
int evutil_make_listen_socket_reuseable(evutil_socket_t sock);
实际上是对setsockopt的简单封装:
int
evutil_make_listen_socket_reuseable(evutil_socket_t sock)
{
#ifndef WIN32
int one = 1;
/* REUSEADDR on Unix means, "don't hang on to this address after the
* listener is closed." On Windows, though, it means "don't keep other
* processes from binding to this address while we're using it. */
return setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one,
(ev_socklen_t)sizeof(one));
#else
return 0;
#endif
}
这个选项的意思很明显,对于一个TCP server来说它更加的常见,可以重用地址。譬如说,当我们kill掉一个server进程,然后立刻restart这个server,如果在bind()
之前不设置SO_RESUEABLE
,将返回错误,因为TIME_WAIT
状态的存在,这些TCP链接将占有当前[ip,port]二元组,一般情况下TIME_WAIT
状态将持续2分钟左右,安全的做法是等待TIME_WAIT
状态的结束,不过在实际情况里,我们更希望服务器能够立刻启动。你卡