在服务器端关闭客户端套接字并退出应用程序后,套接字仍会打开一段时间。
我可以通过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 附加程序。 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;
}
}
但这并没有帮助,错误仍然重现。
这不是一个错误。时间等待(和关闭等待)是出于安全目的而设计的。不过,您可以调整等待时间。无论如何,从服务器的角度来看,套接字已关闭,您可以通过 ulimit 计数器放松,除非您正在进行压力测试,否则它没有太大明显的影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)