C++ Boost ASIO套接字使用从未清除的文件描述符
我正在使用Boost ASIO套接字与linux下的一些远程设备通信,但当无法访问端点时,我遇到了一个问题。首先,下面是显示此问题的代码部分: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
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上下文,但它是一个共享指针,现在是全局定义的。上次我们有两个实例。