私は Ubuntu Linux カーネル 3.5.0-23 で epoll サーバーを作成しましたが、1 つの問題で非常にうまく機能しています。クライアントが接続してからログオフすると、すぐにサーバーを再起動できます。ただし、クライアントがまだ接続されていて、サーバーを閉じると、クライアントは切断されますが、ポートは 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 (エラーなし) です。では、なぜそれが起こるのですか?