boost::asio проксирование tcp сессии
От: whitenigga  
Дата: 09.01.13 03:15
Оценка:
>прелесть 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;

        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.