boost asio - изменение некорректного кода - PullRequest
0 голосов
/ 28 января 2012

Этот фрагмент кода является частью реализации прокси-сервера socks5. Это та часть, откуда сервер после установления сокетов связи с прокси-клиентом (в коде - socket_) и целевым сервером (в коде clientSock_) принимает данные, передаваемые в сокет, и обменивается ими с данными, отправленными в другой сокет.

Я указываю, что этот обмен происходит уже в потоке, порождаемом сервером для прокси-клиента.

    std::size_t readable = 0;

    boost::asio::socket_base::bytes_readable command1(true);
    boost::asio::socket_base::bytes_readable command2(true);


    try 
    {
        while (1)
        {
            socket_->io_control(command1);
            clientSock_->io_control(command2);

            if ((readable = command1.get()) > 0)
            {
                transf = ba::read(*socket_, ba::buffer(data_,readable));
                ba::write(*clientSock_, ba::buffer(data_,transf));
                boost::this_thread::sleep(boost::posix_time::milliseconds(500));
            }

            if ((readable = command2.get()) > 0)
            {
                transf = ba::read(*clientSock_, ba::buffer(data_,readable));
                ba::write(*socket_, ba::buffer(data_,transf));
                boost::this_thread::sleep(boost::posix_time::milliseconds(500));
            }
        }
    }
    catch (std::exception& ex)
    {
        std::cerr << "Exception in thread while exchanging: " << ex.what() << "\n";
        return;
    }

Проблема в том, что у меня очень высокий процессор в цикле. Также я не уверен, что здесь можно узнать, закрыла ли одна из частей сокет, чтобы перехватить исключение для ускоренного сокета -> и завершить обмен данными.

1 Ответ

1 голос
/ 29 января 2012

Проблема может быть решена с помощью асинхронных функций записи / чтения.В основном используйте async_read_some() или async_write() - или другие асинхронные функции в этих категориях.Также, чтобы асинхронная обработка работала, необходимо вызвать io_service.run() после того, как была вызвана хотя бы одна асинхронная функция, которая отправит обработчик завершения для асинхронной обработки.

...