Не всегда вызывается handle accept в Debug. (Boost Asio, Ubuntu, Clion)

318
02 мая 2018, 05:14

Функция HandleAccept(...) не всегда вызывается в режиме отладки. Поэтому прихоится перезупускать сервер и конектится, если присоединился, то далее все работает. Иногда приходится повторять раз 10 и более. Приложение закрыл и все по новой. Если просто запускать, то шансов больше.

static boost::asio::io_service *g_stcpIOService = nullptr;
static boost::thread *g_stcNetServiceThread[64] = {0};
void NetServiceRun()
{
    g_stcpIOService->run();
}
void CKernel::InitNetService(INT32 n32ThreadCount)
{
    for(INT32 i = 0; i < n32ThreadCount; ++i) {
        g_stcNetServiceThread[i] = new boost::thread(&NetServiceRun);
    }
}
void CKernel::PrepareForNextAccept()
{
    m_shpNewConnecion.reset(new CConnection(*g_stcpIOService));
    m_pAcceptor->async_accept(m_shpNewConnecion->GetSocket(),
                              boost::bind(&CKernel::HandleAccept, this,
                                          boost::asio::placeholders::error));
}
void CKernel::HandleAccept(const boost::system::error_code & ec)
{
    if(!m_pAcceptor->is_open()) {
        LogPrintDebug("Acceptor Close");
        return;
    }
    if(!ec) {
        LogPrintDebug("Handle Accept Succes");
        m_ConnectionManager.Start(m_shpNewConnecion);
    } else {
        LogPrintDebug("Handle Accept Error: %s", ec.message());
    }
    PrepareForNextAccept();
}
bool CKernel::Initialize()
{
    InitNetService(1);
    m_pAcceptor = new boost::asio::ip::tcp::acceptor(*g_stcpIOService);
    m_pSocket = new boost::asio::ip::tcp::socket(*g_stcpIOService);
    boost::asio::ip::tcp::resolver resolver(*g_stcpIOService);
    boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve({"127.0.0.1", "1973"});
    m_pAcceptor->open(endpoint.protocol());
    m_pAcceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
    m_pAcceptor->bind(endpoint);
    m_pAcceptor->listen();
    PrepareForNextAccept();
}

Функция acync_write не выдает ошибки. при отправке если сервер не вызывает HandleAccept

async_write(m_Socket, boost::asio::buffer(buffer,size),[this](boost::system::error_code ec, std::size_t length)
    {
        if(!ec)
        {
            std::cout << "async_write ok " << std::endl;
            DoReadHeader();
        }
    });

Если вызвать netstat при этом.

cucaracha@cucaracha-Lenovo-B50-30:~$ netstat | grep 1973
tcp        0      0 localhost:58642         localhost:1973          ESTABLISHED
tcp       20      0 localhost:1973          localhost:58642         ESTABLISHED
cucaracha@cucaracha-Lenovo-B50-30:~$ netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 localhost:63342         *:*                     LISTEN     
tcp        0      0 localhost:1973          *:*                     LISTEN     
...

Полный код github

Answer 1

Возможно, проблема в следующем: у вас задача запускается так:

  1. Создание io_service
  2. Создание потоков
  3. Запуск задачи на ожидание подключения клиентов

Но у io_service есть одна особенность: цикл событий крутится только до тех пор, пока в нём есть задачи. Т.е. если после создания потоков они сразу запустятся, до того, как главный поток добавит в очередь задание на ожидание подключения, потоки просто завершатся, т.к. в очереди еще нет задач.

Способа решения два - либо создавать потоки после того, как будет вызвано ожидание подключения, либо до создания потоков создавать объект io_service::work, который не позволит завершиться потокам до того, как экземпляр io_service::work будет уничтожен.

READ ALSO
Непонятное поведение программы

Непонятное поведение программы

Нужно написать реализацию метода шаблонного класса List для простых типов данных и строк(сhar*), которая будет загружать список с csv файлаНаписал,...

248
Асинхронная запись в файл WinApi

Асинхронная запись в файл WinApi

Есть программа поиска всех файлов каталоге С

267
Реализация алгоритма CN2

Реализация алгоритма CN2

Есть ли у кого-нибудь реализация данного алгоритма на языках C/C++/Java? Ну, или хотя бы псевдокод с описанием? Буду рад любой помощи

246
Как получить и обработать строку в функции модуля Python?

Как получить и обработать строку в функции модуля Python?

Нужно писать модуль для python на c++Хочу передать из пайтона в функцию строковый аргумент, как-то изменить ее, например добавив "!", и вернуть обратно...

226