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、2つの引数で構築可能でした。これは、 1.35および1.53std::stringのオーバーロードされたコンストラクターのドキュメントです。

#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()。さらに、 3つのタイプが異なるため、またはでconst char*はなく、を介して構築できます。const 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

また、URLの代わりにIPアドレスを使用しようとすると問題が発生しました。エンドポイントを作成し、それをソケットオブジェクトから離れた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 に答える