在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状态的结束,不过在实际情况里,我们更希望服务器能够立刻启动。你卡
本文详细解释了SO_REUSEADDR选项的作用及其实现原理。通过libevent库中的evutil_make_listen_socket_reuseable函数,展示了如何避免因TIME_WAIT状态导致的TCP服务重启失败问题。
493

被折叠的 条评论
为什么被折叠?



