boost::asio
От: johny5 Новая Зеландия
Дата: 12.06.09 11:17
Оценка:
Всем привет.

Сабж поддерживает работу через TCP прокси?

Какойнть минимальнейший пример, пожалуйста.
В интернете об этом что то совсем ничего..
Re: boost::asio
От: Cyberax Марс  
Дата: 12.06.09 11:21
Оценка:
Здравствуйте, johny5, Вы писали:

J>Сабж поддерживает работу через TCP прокси?

Что такое "TCP прокси"? SOCKS-прокси?
Sapienti sat!
Re[2]: boost::asio
От: johny5 Новая Зеландия
Дата: 12.06.09 11:44
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, johny5, Вы писали:


J>>Сабж поддерживает работу через TCP прокси?

C>Что такое "TCP прокси"? SOCKS-прокси?

Ну да, любое из.. SOCKS4, 5..
Я, честно говоря, в этих вопросах слаб.
Re: boost::asio
От: Sni4ok  
Дата: 12.06.09 11:44
Оценка: 4 (1)
Здравствуйте, johny5, Вы писали:

J>Какойнть минимальнейший пример, пожалуйста.

J>В интернете об этом что то совсем ничего..

rfc уже отменяли?

using boost::asio::ip::tcp;

void SocketConnect(tcp::socket& socket, boost::asio::io_service& io_service, const std::string& host, size_t port)
{
    boost::system::error_code error = boost::asio::error::host_not_found;
    tcp::resolver resolver(io_service);
    tcp::resolver::query query(host, boost::lexical_cast<std::string>(port), boost::asio::ip::resolver_query_base::numeric_service);
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::resolver::iterator end;

    while (error && endpoint_iterator != end)
    {
        socket.close();
        socket.connect(*endpoint_iterator++, error);
    }
    if (error)
        throw boost::system::system_error(error);
}

void SocksConnect(tcp::socket& socket, boost::asio::io_service& io_service, const std::string& host, size_t port, const std::string& socks_host, size_t sock_port)
{
    SocketConnect(socket, io_service, socks_host, sock_port);

    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << char(0x05) //socks version
        << char(0x01) //command connect
        << char(0x00);//no auth

    boost::asio::write(socket, request);
    boost::asio::streambuf response;
    boost::array<char, 2> str;
    boost::asio::read(socket, boost::asio::buffer(str,2));
    if (str[1]==0xFF) throw std::runtime_error("socks 0xff error");
    if (str[0]!=0x05) throw std::runtime_error("socks !0x05 error");

    boost::uint16_t port_n = port;
    request_stream << char(0x05) //socks version
        << char(0x01) //command connect
        << char(0x00) //reserve
        << char(0x03) //ATYP full domain name
        //<< char(213) << char(180) << char(214) << char(131)
        << char(host.size()) << host
        << ((char*)(&port_n))[1] << ((char*)(&port_n))[0];

    boost::asio::write(socket, request);
    boost::array<char, 10> resp;
    boost::asio::read(socket, boost::asio::buffer(resp,10));
    if(resp[1])
        throw std::runtime_error("socks returned error while connect");
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.