Boost的TCP basic_resolver_query构造函数的参数

时间:2013-03-07 14:42:55

标签: c++ boost boost-asio

在使用一个非常简单的c ++程序来监听给定端口时,我遇到了一些麻烦。主要是,我在创建basic_resolver_query时遇到问题。如果我这样做:

boost::asio::ip::tcp::resolver::query query( "0.0.0.0", "5938" );

我的工作完美无瑕。但显然我不想对端口进行硬编码,所以我一直试图从文件中读取它并将其传递到那里:它无效。

如果我尝试直接将其作为std::string传递,它就不起作用了,我想是可以预料到的。但是我试过传递m_listenPort.c_string()并且没有这样做。

我一直试图查看文档,在示例中,但我什么都找不到。我该怎么做?

3 个答案:

答案 0 :(得分:2)

以下适用于我:

std::string host = "192.168.1.1", port = "1234";
tcp::resolver::query query(tcp::v4(), host, port);

答案 1 :(得分:2)

据我所知,自从引入Boost.Asio以来,boost::asio::ip::basic_resolver_query可以使用两个std::string参数构造。以下是1.351.53中重载的构造函数文档。

#include <string>
#include <boost/asio.hpp>

int main()
{
  std::string host = "127.0.0.1";
  std::string port = "1234";
  using boost::asio::ip::tcp;
  tcp::resolver::query query1("127.0.0.1", "1234");
  tcp::resolver::query query2(host, port);
  tcp::resolver::query query3(host.c_str(), port.c_str());
}

您是否可能未使用std::string或提供用户定义转换的类型来构建std::string的类型?例如,std::string提供c_str(),而非c_string()。此外,它可以通过const char*构建,而不是const unsigned char*const signed char*,因为这三种类型是截然不同的。

答案 2 :(得分:1)

尝试使用IP地址而不是URL时,我也遇到了一些问题。发现了创建端点的技术,并且在socket对象的next_layer对象的connect方法中使用它对我有用:

const boost::asio::ip::address IP(boost::asio::ip::address::from_string(serverPath));
int iport = atoi(port.c_str());
const boost::asio::ip::tcp::endpoint EP(IP, iport);
// 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);
//
// Try to connect to the server.  Note - add timeout logic at some point.
boost::system::error_code EC;
pSocket->next_layer().connect(EP, EC);
if (EC)
{
   // Log an error.  This worker thread should exit gracefully after this.
   stringstream ss;
   ss << "SSLSocket::Connect: connect failed to " << sClientIp << " : " << uiClientPort << ".  Error: " << EC.message() + ".\n";
   Log.LogString(ss.str(), LogError);
}