2

ブーストを学習し、昼間のサーバー クライアントのをコンパイルしました。例にあるポート 13 を使用できないため、サーバーとクライアントの例でポート番号のみを変更しました。サーバーは正常に動作しますが、クライアントは接続していないようで、エラーは発生しません。

クライアントの入力データは「127.0.0.1」です。

サーバ:

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

using boost::asio::ip::tcp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

int main()
{
  try
  {
    boost::asio::io_service io_service;

    tcp::endpoint endpoint(tcp::v4(), 8087);
    tcp::acceptor acceptor(io_service, endpoint);

    for (;;)
    {
      tcp::iostream stream;
      acceptor.accept(*stream.rdbuf());
      stream << "test" << make_daytime_string();
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

そしてクライアント:

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

using boost::asio::ip::tcp;

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: daytime_client <host>" << std::endl;
      return 1;
    }

    tcp::iostream s(argv[1], 8087);
    std::string line;
    std::getline(s, line);
    std::cout << line << std::endl;
  }
  catch (std::exception& e)
  {
    std::cout << "Exception: " << e.what() << std::endl;
  }

  return 0;
}
4

4 に答える 4

2

私にとってうまくいったのは、エンドポイントの作成方法を変更することでした

tcp::endpoint( tcp::v4(), port );

tcp::endpoint( boost::asio::ip::address::from_string("127.0.0.1"), port );

最初の方法は、Mac OS X では問題なく動作する 0.0.0.0 のエンドポイントを作成しますが、Windows (XP、MSVC 2008 でビルド) では「無効」というメッセージが表示されます。

なぜ違いがあるのか​​ はわかりませんが、少なくとも機能します。

于 2011-06-17T23:24:58.850 に答える
1

うーん、すべて 1_36 ブースト バージョンと msvc 2005 コンパイラで動作します。
ファイアウォールの設定を確認してください。

于 2009-04-04T20:04:04.730 に答える
1

これをデバッグするには、いくつかのことが役立ちます。

  1. どのプラットフォームを実行していますか
  2. バージョンを含む、使用しているコンパイラ
  3. どのバージョンのブーストを使用していますか

また、サーバーが 127.0.0.1 または外部インターフェイスにバインドされているかどうかを確認する必要があります。127.0.0.1 の代わりに、外部インターフェイスの IP アドレスを使用してみてください。Windows では ipconfig を使用して、Linux では ifconfig を使用してこれを確認してください。

于 2009-04-04T20:28:46.993 に答える
1

ポートオプションは、サービスの名前である可能性のある文字列を「daytime」として受け取り、対応するポートまたは明示的にポートを検索しますが、文字列である必要があります。

tcp::iostream s(argv[1], "8087");

于 2010-10-01T14:43:15.037 に答える