Всем привет.
Сабж поддерживает работу через TCP прокси?
Какойнть минимальнейший пример, пожалуйста.
В интернете об этом что то совсем ничего..
Здравствуйте, 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");
}