2009-02-23 12 views
5

boost.asioは、クライアントアプリケーションがサーバーに接続しているときに、IPアドレスとポートを使用して基本コンセプトを使用していません。私はBoostの少しのnoobieかもしれません - と私はそれを受け入れる - とにかく私は理解していません。
だから、私は、ローカルホスト上のサーバーに接続しているクライアント取得するには、このようなコードを持っています。サーバーを識別するために - - IPとポートのWinSockの2.0に私のサーバーアプリケーションがどのポートをリッスンしているかを、boost.asioがどのように発見するのか?


     boost::asio::io_service io_service; 
     tcp::resolver resolver(io_service); 
     tcp::resolver::query query("localhost", "daytime"); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
     tcp::resolver::iterator end; 

     tcp::socket socket(io_service); 
     boost::system::error_code error = boost::asio::error::host_not_found; 
     while(error && endpoint_iterator != end) { 
      socket.close(); 
      socket.connect(*endpoint_iterator++, error); 
     } 

Windowsは、2つのパラメータを使用しています。
したがって、どのポートが接続をリッスンしているサーバーであるかをAsioがどのくらい知っていますか?すべてのポートをスキャンしますか?そして、そうであれば、同時に2つのサーバーが異なるポートでリッスンするとどうなりますか?

答えて

5

昼間サービスで使用されているポートでlocalhostに接続するように指定しています。サービスファイル(通常はC:\ WINDOWS \ system32 \ drivers \ etc \ services、Windowsでは/ Unixでは/ etc/servicesだと考えられます)で適切なポート番号を検索します。そこに明示的なポート番号を使用することもできます。

+0

私は2番目のパラメータがクエリーctorで何を意味するのかよく分かりません。最初のIPアドレスは私が接続したいIPアドレスです。そして第二の意味は何ですか? – chester89

+0

2番目のパラメータは、ポート番号またはサービス名です。サービス名の場合、asioはサービスファイル内でそのサービスの適切なポート番号を検索します。テキストエディタでサービスファイルを見ると、その動作方法がわかります。 – Ferruccio

+0

OK、必要なポートでサーバを起動するにはどうすればいいですか?サーバー側のコードは次のとおりです。 boost :: asio :: io_service io_service; tcp :: acceptorアクセプタ(io_service、tcp :: endpoint(tcp :: v4()、13)); – chester89

8

は、あなたの質問に答えるために、

tcp::resolver::query query("localhost", boost::lexical_cast<string>(port));//assuming port is an int 

を試してみてください、あなたはポート13上のサーバーを起動している。これは、Linuxの昼間のサービス(http://www.sorgonet.com/linux/linuxdaemons/)を実行しているポートであることを起こることを思い出してください。したがって、ポートを指定するのではなく、引き続きquery( "localhost"、 "daytime")を使用することができます。

0

オープンnetcatは、ローカルホストのポート13でリッスンします。 デモの接続を受け入れます。いくつかのblablaを入力するとデモプログラム の出力がnetcatを実行するのを見るでしょう: nc -l -p 13

windows?ネットキャット? cygwinをインストールしてnetcatを追加してください

関連する問題