c++ - 套接字在处理后打开,打开它完成

标签 c++ c sockets log4cxx apr

在服务器端关闭客户端套接字并退出应用程序后,套接字仍然打开了一段时间。

通过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/

相关文章:

c++ - 在 ‘begin’中请求成员 ‘c’,它是非类类型 ‘char [101]’ sort(c.begin(),c.end());

c++ - 从正在运行的进程设置线程优先级

c - 错误 : Expected ';' , ',' 或 ')' 之前(第一个参数的名称)

c# - 在 c#.net 中如何通过互联网向远程计算机发送消息?

c++ - 为什么使用指令的范围会有所不同?

C++ 指向另一个函数中的数组

c - 调用 fork() 后函数返回值的可见性

c - fstream vector C

sockets - 组播中的环回

java - 通过浏览器显示或下载图像