我在 Ubuntu Linux 内核 3.5.0-23 上编写了一个 epoll 服务器,可以很好地解决一个问题:如果客户端连接,然后注销,我可以立即重新启动服务器。但是,如果客户端仍然连接,而我关闭服务器,他将断开连接,但端口仍然会绑定 X 秒(不能告诉 X,我会说大约 20)。如果我用编译器终止程序,也会发生这种情况。
关闭时,我使用的功能与客户离开时使用的功能完全相同:
int CEpollClient::Close ()
{
if(m_socket!=SOCKET_ERROR)
{
int res=::epoll_ctl (m_server_handler, EPOLL_CTL_DEL, m_socket, 0);
_debug_message("client exits");
_debug_message(res);
shutdown(m_socket,SHUT_RDWR);
::close (m_socket);
m_socket=SOCKET_ERROR;
}
return 0;
}
这是客户端类的一部分,因此无论我是在客户端离开后关闭客户端还是我自己初始化它,都会调用完全相同的代码。关闭服务器时我也在关闭监听套接字:
if (m_listener != SOCKET_ERROR)
{
_debug_message("stop listener");
code=epoll_ctl(m_epoll_handler,EPOLL_CTL_DEL,m_listener,0);
_debug_message(code);
shutdown(m_listener,SHUT_RDWR);
::close(m_listener);
m_listener = SOCKET_ERROR;
}
有人可以提供任何想法吗?这并不可怕,它是可行的,但它看起来像一个错误。调试消息 s 中的返回码始终为 0 - 没有错误。那么为什么会发生呢?