0

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

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

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

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

我一直在尝试查看文档和示例,但我什么也找不到。我该怎么做?

4

3 回答 3

3

据我所知,自从 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*、 notconst unsigned char*或构造const signed char*,因为这三种类型是不同的。

于 2013-03-07T16:45:01.607 回答
2

以下对我有用:

std::string host = "192.168.1.1", port = "1234";
tcp::resolver::query query(tcp::v4(), host, port);
于 2013-03-07T16:19:36.317 回答
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);
}
于 2013-03-07T22:25:09.480 回答