1

次のようなコードがあります。

//unrelated code snipped
resolver.reset(new tcp::resolver(iosvc));
tcp::resolver::query query(host, port);
resolver->async_resolve(query,
    boost::bind(&TCPTransport::handle_resolve, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::iterator));

LOG4CXX_INFO(logger, "Attempting connection to at " << host << ":" << port);
//unrelated code snipped



void TCPTransport::handle_resolve(const boost::system::error_code& err,
  tcp::resolver::iterator endpoint_iterator)
{
  if (err)
  {
    LOG4CXX_ERROR(logger, "Error: " << err.message());
  }
  else
  {
    tcp::endpoint endpoint = *endpoint_iterator;
    if (!socket)
    {
      socket.reset(new tcp::socket(iosvc));
    }
    socket->async_connect(endpoint,
      boost::bind(&TCPTransport::handle_connect, this,
        boost::asio::placeholders::error, ++endpoint_iterator));
  }
}

サーバーの適切なゲートとポートを使用してこのコードを実行すると、ログ ファイルに次のテキストが表示されます: エラー: サービスが見つかりません

このエラーが実際に何を意味するのかについて、誰かが洞察を提供できますか?

4

1 に答える 1

2

Boost では、そのエラーは getaddrinfo() への呼び出しの結果としてのみ発生する可能性があるようです。 MSDN (価値があるため) では、呼び出し元 (ASIO?) がサポートするソケットの種類に対して、サービス名 (またはポート) がサポートされていないようです。

つまり、TCP 以外のソケット (DNS 解決に TCP クラスを使用しているため可能性は低い) または非 TCP ポート (何をすべきかわからない) で TCP 接続を試みているようです。そのことについて)。

デバッガーを使用してコードにステップ インし、何が問題なのかを確認することをお勧めしますが、resolve() の同期呼び出しを使用すると、はるかに簡単になります。そうしないと、ASIO が使用するさまざまな内部ハンドラーに複数のブレークポイントを設定する必要があります (それほど悪くはありませんが、それでも面倒です)。それが役立つことを願っています...

于 2009-11-09T17:58:52.160 に答える