C++ Boost ASIO套接字使用从未清除的文件描述符

C++ Boost ASIO套接字使用从未清除的文件描述符,c++,boost,C++,Boost,我正在使用Boost ASIO套接字与linux下的一些远程设备通信,但当无法访问端点时,我遇到了一个问题。首先,下面是显示此问题的代码部分: try { if(mysocket == NULL) { mysocket = new boost::asio::ip::tcp::socket(io_service); } mysocket->connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::add

我正在使用Boost ASIO套接字与linux下的一些远程设备通信,但当无法访问端点时,我遇到了一个问题。首先,下面是显示此问题的代码部分:

try {
   if(mysocket == NULL)
   {
      mysocket = new boost::asio::ip::tcp::socket(io_service);
   }
   mysocket->connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("192.168.0.12"), 1));
   printf("connected\n");
   return 0;
}
catch (std::exception &e)
{
   boost::system::error_code ec;
   mysocket->close(ec);
   delete mysocket;
   mysocket = NULL;
   printf("not connected %s\n", e.what());
}

通过在我的类中使用这段代码,我得到了越来越多的eventfd类型的文件描述符,直到使用了所有可用的fd,应用程序崩溃。上面的代码有问题吗?为什么boost不关闭文件描述符?我甚至删除了插座!提前谢谢

就像其他人说的,只要不写
新的
删除
,你就知道你自己并没有把事情搞砸

尤其是你的误导

mysocket->close(ec);
将抛出,因为套接字首先未打开,因此您从未到达
delete

但是,
mysocket
可以在作用域结束时自动销毁: 整个代码可以简化为:

#include <boost/asio.hpp>
#include <iostream>
namespace ba = boost::asio;
using ba::ip::tcp;

int main() {
    ba::io_context io_service;
    try {
        tcp::socket mysocket(io_service);
        mysocket.connect({ba::ip::address::from_string("192.168.0.12"), 1});
        std::cout << "Connected to " << mysocket.remote_endpoint() << "\n";
    }
    catch (boost::system::system_error const& se) {
        std::cout << "System error: " << se.code().message() << "\n";
    }
}
#包括
#包括
名称空间ba=boost::asio;
使用ba::ip::tcp;
int main(){
ba::io_上下文io_服务;
试一试{
tcp::socket mysocket(io_服务);
connect({ba::ip::address::from_string(“192.168.0.12”),1});

std::cout就像其他人说的,只要不写
新的
删除
,你就知道你自己没有把事情搞砸

尤其是你的误导

mysocket->close(ec);
将抛出,因为套接字首先未打开,因此您从未到达
delete

但是,
mysocket
可以在作用域结束时自动销毁: 整个代码可以简化为:

#include <boost/asio.hpp>
#include <iostream>
namespace ba = boost::asio;
using ba::ip::tcp;

int main() {
    ba::io_context io_service;
    try {
        tcp::socket mysocket(io_service);
        mysocket.connect({ba::ip::address::from_string("192.168.0.12"), 1});
        std::cout << "Connected to " << mysocket.remote_endpoint() << "\n";
    }
    catch (boost::system::system_error const& se) {
        std::cout << "System error: " << se.code().message() << "\n";
    }
}
#包括
#包括
名称空间ba=boost::asio;
使用ba::ip::tcp;
int main(){
ba::io_上下文io_服务;
试一试{
tcp::socket mysocket(io_服务);
connect({ba::ip::address::from_string(“192.168.0.12”),1});

std::cout“我在泄漏资源”与手动资源管理相结合会立即引起怀疑。切换到RAII'd资源可能会使错误消失。我不理解“我在泄漏资源”与手动资源管理相结合应该会立即引起怀疑。切换到RAII的资源可能会使错误消失。我不这么认为understand@DeepakAnmol你能说说问题是什么吗?因为你可以相信我读了很多遍。我明确地解释了为什么你不删除套接字。每当我们执行这一行时
mysocket=newboost::asio::ip::tcp::socket(io\U服务)当时,eventfd、eventpoll和timerfd被创建为文件描述符。当我们调用
mysocket->connect…
时,TCP连接就建立起来了。当整个执行完成后,只有TCP连接文件描述符关闭,而不是eventfd、eventpoll和timerfd,在这两者之间,我们得到了许多文件“打开”,因为文件描述符定义的计数更大。您是否也在动态分配
io\u服务
?我的意思是,如果您对显示的代码段中的资源管理不当(如我所解释的)你在其他地方也有类似的问题,这并非不可能。我真的很想提供更多帮助,但除非你发布更多代码或重写代码,不使用手动内存管理,而只使用异常安全资源获取,否则我无法多说。你明白你展示的代码是如何存在缺陷的吗?特别是在你y“但当无法到达端点时,我遇到了一个问题”从定义上讲,这意味着将无法实现
删除
。您的想法很好。因为IO服务随IO上下文而改变。我现在使用了该IO上下文,但它是一个共享指针,现在是全局定义的。上次我们有两个实例。@DeepakAnmol您能说一下问题是什么吗?因为您可以相信我读到了我t多次。我明确解释了为什么不删除套接字。每当我们执行这一行时,
mysocket=new boost::asio::ip::tcp::socket(io_服务)当时,eventfd、eventpoll和timerfd被创建为文件描述符。当我们调用
mysocket->connect…
时,TCP连接就建立起来了。当整个执行完成后,只有TCP连接文件描述符关闭,而不是eventfd、eventpoll和timerfd,在这两者之间,我们得到了许多文件“打开”,因为文件描述符定义的计数更大。您是否也在动态分配
io\u服务
?我的意思是,如果您对显示的代码段中的资源管理不当(如我所解释的)你在其他地方也有类似的问题,这并非不可能。我真的很想提供更多帮助,但除非你发布更多代码或重写代码,不使用手动内存管理,而只使用异常安全资源获取,否则我无法多说。你明白你展示的代码是如何存在缺陷的吗?特别是在你y“但是当端点不可到达时我有一个问题”,根据定义,这意味着将无法到达
删除
。您的想法很好。由于IO服务随IO上下文而改变。我使用了该IO上下文,但它是一个共享指针,现在是全局定义的。上次我们有两个实例。