Я использую Boost :: ASIO версии 1.52.0 для Windows с версией SSL C на тестовой машине с Win 8 с кодом Visual Studio 2008 в VC++.Использование ip-адреса вместо url в asio
У меня есть некоторый код, который успешно подключается к серверу TCP с заданной URL:
// Create the resolver and query objects to resolve the host name in serverPath to an ip address.
boost::asio::ip::tcp::resolver resolver(*IOService);
boost::asio::ip::tcp::resolver::query query(serverPath, port);
boost::asio::ip::tcp::resolver::iterator EndpointIterator = resolver.resolve(query);
// Set up an SSL context.
boost::asio::ssl::context ctx(*IOService, boost::asio::ssl::context::tlsv1_client);
// Specify to not verify the server certificiate right now.
ctx.set_verify_mode(boost::asio::ssl::context::verify_none);
// Init the socket object used to initially communicate with the server.
pSocket = new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(*IOService, ctx);
//
// The thread we are on now, is most likely the user interface thread. Create a thread to handle all incoming socket work messages.
// This thread is created for each connection to a server.
if (!RcvThreadCreated)
{
WorkerThreads.create_thread(boost::bind(&SSLSocket::RcvWorkerThread, this));
RcvThreadCreated = true;
WorkerThreads.create_thread(boost::bind(&SSLSocket::SendWorkerThread, this));
}
// Try to connect to the server. Note - add timeout logic at some point.
boost::asio::async_connect(pSocket->lowest_layer(), EndpointIterator,
boost::bind(&SSLSocket::HandleConnect, this, boost::asio::placeholders::error));
На основании некоторых исследований, приведенный выше код, который разрешает IP-адрес не может быть использован, если IP-адрес подставляется для URL-адреса в serverPath. Похоже, что правильный подход заключается в создании конечной точки, как это:
const boost::asio::ip::address IP(boost::asio::ip::address::from_string(serverPath));
int iport = atoi(port.c_str());
boost::asio::ip::tcp::endpoint EP(IP, iport);
Эта часть кажется компилировать нормально. Но позже в методе async_connect:
// Try to connect to the server. Note - add timeout logic at some point.
boost::asio::async_connect(pSocket->lowest_layer(), EP,
boost::bind(&SSLSocket::HandleConnect, this, boost::asio::placeholders::error));
он генерирует ошибку. Я предполагаю, что метод async_connect хочет видеть итератор для второго аргумента. Но я не уверен, как его создать.
Согласно следующему link, ответ предполагает, что можно использовать метод соединения на объекте сокета. Но, когда я пытаюсь сделать это:
pSocket->connect(EP);
Компилятор выдает ошибку - ошибка C2039:
'connect' : is not a member of 'boost::asio::ssl::stream<Stream>'
Так, может кто-то пожалуйста, покажите простой код, который предоставляет возможность подключения к серверу с IP-адрес вместо URL-адреса?
Если это невозможно, то есть ли способ сделать обратный поиск с IP-адреса, чтобы получить URL-адрес?
Неясно, где ваш отказ от компиляции, можете ли вы объединить свои фрагменты в один пример кода? –