Сокет Boost ASIO потребляет дескрипторы файлов, которые никогда не очищаются - PullRequest
1 голос
/ 08 мая 2020

Я использую сокеты 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 не закрывает файловые дескрипторы? Я даже розетку удаляю! Заранее спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Как говорили другие, просто не пишите new и delete, и вы знаете, что не испортили это сами.

В частности, ваш ошибочный

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