Tcp 接受在 1 小时后首次连接后失败

Tcp accept fails after first connection after 1 hour

本文关键字:连接 失败 小时 Tcp      更新时间:2023-10-16

我已经编写了C++客户端服务器应用程序,但服务器崩溃了。场景

  1. 启动服务器
  2. 1 小时后(不是之前)客户端连接

然后,正在接受中等待的服务器返回 -1,并带有错误"打开的文件太多"。

机器上没有运行任何其他特殊的东西,这让我相信 accept 在等待时打开了许多文件描述符。这是真的吗?如何解决此问题,以便客户端可以随时连接?

相关服务器代码:

int sockClient;
while (true) {
    sockaddr_in* clientSockAddr = new sockaddr_in();
    socklen_t clientSockAddrLen = sizeof(sockaddr_in);
    sockClient = accept(sockServer, (sockaddr *) clientSockAddr,
                        &clientSockAddrLen);
    if(sockClient == -1 ){
        std::ostringstream s;
        s << "TCP Server: accept connection error." << std::strerror(errno);
        throw runtime_error(s.str());
    }
    connection->communicate(sockClient, clientSockAddr, clientSockAddrLen);
}

您在某处有一个文件描述符泄漏。可能您在完成接受的套接字后没有关闭它们,或者它在某个地方的文件中。