我已經通過Ubuntu Linux內核3.5.0-23編寫了epoll服務器,在一個問題上運行得很好:如果客戶端連接,然後註銷,我可以立即重新啓動服務器。但是,如果客戶端仍然連接並關閉服務器,他將斷開連接,但端口仍然會被綁定X秒(不能告訴X,我會說大約20)。 如果我正在用編譯器終止程序,這也會發生。epoll服務器不會解除綁定
當關閉時,我使用的是當客戶離開我使用的是完全相同的功能:
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;
}
有人能提供什麼想法?這並不可怕,而且可行,但它確實看起來像一個bug。 調試消息中的返回碼始終爲0 - 無錯誤。 那麼爲什麼會發生?
對不起......我不重複使用套接字。正如我寫的,我可以終止程序,並重新運行它,仍然會出現此綁定錯誤。 TY的時間 – donald