gpt4 book ai didi

c++ - Boost ASIO套接字消耗从未清除的文件描述符

转载 作者:行者123 更新时间:2023-12-02 10:32:42 27 4
gpt4 key购买 nike

我正在使用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类型的文件描述符,直到使用了所有可用的fds且应用程序崩溃为止。上面的代码有什么问题吗?为什么boost没有关闭文件描述符?我什至删除套接字!提前致谢!

最佳答案

就像其他人说的那样,只是不要编写newdelete,并且您知道自己并没有弄乱它。

特别是您的误导

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";
}
}

关于c++ - Boost ASIO套接字消耗从未清除的文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61687585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com