【问题标题】:Tcp accept fails after first connection after 1 hour1 小时后第一次连接后,Tcp 接受失败
【发布时间】:2014-05-18 11:03:17
【问题描述】:

我编写了 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);
}

【问题讨论】:

    标签: c++ tcp client-server


    【解决方案1】:

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

    【讨论】:

    • 在这种情况下,我只有一个连接......如果泄漏在其他地方,我为什么只得到上述接受中的错误?我将返回并查看代码中的其他区域是否存在泄漏。谢谢。
    • 我发现了问题,确实EJB是对的。我有一个循环,它试图连接到另一台服务器,但由于它丢失了连接没有成功,但套接字没有被释放。我不清楚为什么“接受”失败而不是“套接字”......
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2021-08-22
    • 2013-11-17
    相关资源
    最近更新 更多