在服务器端关闭客户端套接字并退出应用程序后,套接字仍然打开了一段时间。
通过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;
}
}
但这并没有帮助,错误仍然重现。
最佳答案
这不是错误。时间等待(和关闭等待)是出于安全目的而设计的。但是,您可以调整等待时间。在任何情况下,从服务器的角度来看,套接字已关闭并且您可以通过 ulimit 计数器放松,除非您正在进行压力测试,否则它不会产生太大的可见影响。
关于c++ - 套接字在处理后打开,打开它完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31831089/