後押し:: ASIO :: IP :: TCP ::リゾルバ::決意()ブロックを永遠に
-
21-08-2019 - |
質問
私は<のhref =「http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/echo/blocking_tcp_echo_client.cpp」のrelと同様のものを作成しようとしています=」 noreferrer nofollowを ">このコードはをboost.asio例で見つけます。
のsocket.hます:
class some_class {
private:
...
boost::asio::io_service io_service;
public:
some_class() {
/* This stuff isn't used in the example...
...but it doesn't change anything... */
io_service.run();
}
};
socket.cppます:
using boost::asio::ip::tcp;
bool some_class::connect(char* host, char* port)
{
printf("Resolving hostname...\n");
/* Resolve hostname. */
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), host, port);
tcp::resolver::iterator iterator = resolver.resolve(query);
printf("Connecting to %s:%s... ", host, port);
/* Connect to resolved hosts. */
sock->connect(*iterator);
return true;
}
G ++は、エラーなしでこれを構築しますが、コードはresolver.resolve()の呼び出しを過ぎてそれを作ることはありません。
私はホストとポートのための「80」を「127.0.0.1」とは「localhost」の両方を試してみました。 (それは問題だと思いますが、apache2のは稼働中ではありません)。
私は自分のアプリケーションのうち、+ C Ctrlキーを押しながらすると、それは明らかに終了しますが、それがない直前に「文字列への接続」。
出力を行います私は同じ問題が発生した場合の例を自分で構築し、見に計画していて、間違いなくここでの結果を掲載します。誰もがこの問題に遭遇したり、おそらくこのような現象を発生させることができるものを知っていますか?
編集:
例では、私は私が思う行うにはいくつかのデバッグを持っている...うまく動作します。
第二編集:
私はそれを取得しない、異なる可能性がある唯一のものは、ホスト/ポートです。
例は、charを使用しています* ARGV []と私が使用している:
char host[] = "localhost";
char port[] = "80";
第三編集:
それは確かに接続でブロックしているように見える、(標準出力)にfflushを忘れていました。それはソケットに問題があります。いくつかのより多くのテストをするつもります。
第四編集:
私の愚かな、それがすべてでブロックしていませんでした!私は、コンソール出力にあまり頼った..
解決
おそらく、printfの後、接続するための呼び出しでブロックされます。
stdoutがデフォルトでバッファリングラインで、あなたのprintfの文字列の末尾に\ nを持っていないので、あなたはその出力は表示されません。あなたがプログラムを強制終了すると、バッファを使用すると、そのメッセージを参照してください理由である、フラッシュされます。