Этот фрагмент кода является частью реализации прокси-сервера 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;
}
Проблема в том, что у меня очень высокий процессор в цикле. Также я не уверен, что здесь можно узнать, закрыла ли одна из частей сокет, чтобы перехватить исключение для ускоренного сокета -> и завершить обмен данными.