【发布时间】:2015-08-05 11:21:50
【问题描述】:
在服务器端关闭客户端套接字并退出应用程序后,套接字仍然打开一段时间。
我可以通过 netstat 看到它
Every 0.1s: netstat -tuplna | grep 6676
tcp 0 0 127.0.0.1:6676 127.0.0.1:36065 TIME_WAIT -
我使用 log4cxx 日志记录和 telnet appender。 log4cxx 使用 apr 套接字。 Socket::close() 方法看起来像这样:
void Socket::close() {
if (socket != 0) {
apr_status_t status = apr_socket_close(socket);
if (status != APR_SUCCESS) {
throw SocketException(status);
}
socket = 0;
}
}
并且已成功处理。但是程序完成后我可以通过 netstat 看到打开的套接字,如果它再次启动 log4cxx 无法打开 6676 端口,因为它很忙。 我尝试修改 log4cxx。 关闭前关闭套接字:
void Socket::close() {
if (socket != 0) {
apr_status_t shutdown_status = apr_socket_shutdown(socket, APR_SHUTDOWN_READWRITE);
printf("Socket::close shutdown_status %d\n", shutdown_status);
if (shutdown_status != APR_SUCCESS) {
printf("Socket::close WTF %d\n", shutdown_status != APR_SUCCESS);
throw SocketException(shutdown_status);
}
apr_status_t close_status = apr_socket_close(socket);
printf("Socket::close close_status %d\n", close_status);
if (close_status != APR_SUCCESS) {
printf("Socket::close WTF %d\n", close_status != APR_SUCCESS);
throw SocketException(close_status);
}
socket = 0;
}
}
但它没有帮助,错误仍然重现。
【问题讨论】: