>прелесть asio в неблокирующих операциях
Что за предрассудки?
>но если по какой-то причине все таки нужно именно так, то у асио-сокета есть метод native() который не что иное как дескриптор, суй его в select() и будет тоже самое что ты привел но асио.
Да не обязательно именно так, я потому и описал задачу подробно. Методы native() точно не годятся, тогда смысл использования asio точно теряется.
Решил примерно так, пока без проверок ошибок, кидания сепшенов и прочего мяса:
void read_some_handler(const boost::system::error_code& error, size_t bytes_transferred,
size_t* pbytes_readed)
{
*pbytes_readed = bytes_transferred;
}
main...
{
tcp::socket sock0 = tcp::socket(io_service);
tcp::socket sock1 = tcp::socket(io_service);
boost::array<unsigned char, 65536> buffer;
size_t bytes_readed0 = 0;
size_t bytes_readed1 = 0;
sock0.async_read_some(boost::asio::buffer(buffer),
boost::bind(&read_some_handler, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, &bytes_readed0));
sock1.async_read_some(boost::asio::buffer(buffer),
boost::bind(&read_some_handler, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, &bytes_readed1));
for(;;)
{
io_service.run_one();
if(bytes_readed0) //пришли данные на sock0
{
boost::asio::write(sock1, boost::asio::buffer(buffer), boost::asio::transfer_exactly(bytes_readed0));
sock0.async_read_some(boost::asio::buffer(buffer),
boost::bind(&read_some_handler, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, &bytes_readed0));
bytes_readed0 = 0;
}
if(bytes_readed1) //пришли данные на sock1
{
boost::asio::write(sock0, boost::asio::buffer(buffer), boost::asio::transfer_exactly(bytes_readed1));
sock0.async_read_some(boost::asio::buffer(buffer),
boost::bind(&read_some_handler, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, &bytes_readed1));
bytes_readed1 = 0;
}
}
}