2009-06-24 27 views
1

おはようございます。私はちょうどboost :: asioライブラリを使い始めており、boost :: asio :: ip :: tcp :: iostreamに関連したいくつかの初期の難しさに遭遇しました。どのように1は、単にホストとポート番号を使用してのiostreamを接続しないブーストASIOのIP TCPのiostreamエラー検出

1):

私の質問は2つの部分がありますか?

clientserver [boost.org]の例は、コード化された状態で正常に動作させることができます。サーバーはポートを明示的に指定します。

boost::asio::io_service io_service; 

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

ポート13は、「昼間」サービスのためのよく知られたポートです。

クライアントの例では、ホストおよびサービス名指定して接続します。私自身のアプリケーションのために

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

を、私は、任意のポートにサーバーを配置し、以下に示すように数で接続したいと思います:

サーバー:

boost::asio::io_service io_service; 
tcp::endpoint endpoint(tcp::v4(), port); 
tcp::acceptor acceptor(io_service, endpoint); 
acceptor.accept(*this->socketStream.rdbuf()); 
... 

クライアント:

boost::asio::ip::tcp::iostream sockStream; 
... 
sockStream.connect("localhost", port); 
... 

クライアントでポート番号を(サービス名ではなく)直接指定しようとすると、ストリームの接続に失敗します。これを行う方法はありますか?接続する議論がどんなものでなければならないかは、私には分かりません。


2.)iostream :: connectの呼び出しの成功をテストするための好ましい方法は何ですか?

この関数はvoidを返し、例外はスローされません。私が今までに考案した唯一の方法は、stream.fail()および/またはstream.good()をテストすることです。これを行う方法なのか、それとも別の方法がありますか?


これらのいずれかまたは両方に関するアドバイスをいただければ幸いです。また、適切なドキュメンテーションやサンプルが見落とされている場合は、うまくいくでしょう。これまで私は図書館のドキュメントを読んだり、ネットを検索したりして、これらの質問に答えることができませんでした。

答えて

3

asioが(少なくともBoost 1.35.0では)intとして表現されたポート番号で動作しない理由はわかりません。しかし、ポート番号を文字列で指定することができます。すなわち

tcp::iostream s(hostname, "13"); 

となります。エラー検出に関する

tcp::socketがかかり、エンドポイントと、それが正常に接続されているかどうかを教えてくれますboost::system::error_codeオブジェクトへの参照connect()メソッドを持っています。

+0

ありがとうございました。そこで、tcp :: socketを取得し、tcp :: iostreamの内部に埋め込む方法はありますか? –

+0

@Adam - わかりません。私はasioで作業していて、しばらくしています。私が見ているコードでは、iostreamを使用するのではなく、socket :: sendとsocket :: read_someを使用してソケットをI/Oに直接使用しています。 – Ferruccio

+0

少し洗練された代替方法は、 sockStream.connect( "localhost"、lexical_cast (port))です。 –

0

エラーは返されませんが、stream.error()には最新のエラーコードが含まれています。コードを使用しました

do 
{ 
    m_stream.clear(); 
    m_stream.connect(host, port); 
} 
while(m_stream.error());` 

また、特定のエラーboost :: asio :: error :: connection_refusedを確認することもできます。

関連する問題