在使用一个非常简单的c ++程序来监听给定端口时,我遇到了一些麻烦。主要是,我在创建basic_resolver_query时遇到问题。如果我这样做:
boost::asio::ip::tcp::resolver::query query( "0.0.0.0", "5938" );
我的工作完美无瑕。但显然我不想对端口进行硬编码,所以我一直试图从文件中读取它并将其传递到那里:它无效。
如果我尝试直接将其作为std::string
传递,它就不起作用了,我想是可以预料到的。但是我试过传递m_listenPort.c_string()
并且没有这样做。
我一直试图查看文档,在示例中,但我什么都找不到。我该怎么做?
答案 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.35和1.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);
}