2009-03-23 13 views
4

私はboost.asioの例で見つけたthis codeのようなものを作成しようとしています。boost :: asio :: ip :: tcp :: resolver :: resolve()blocks forever

の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:エラーなしにこれを構築しますが、コードはresolver.resolve()の呼び出しを過ぎてそれを作ることはありません++

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; 
} 

グラム。
ホストの場合は「127.0.0.1」と「localhost」、ポートの場合は「80」の両方を試しました。 (問題はないと思うが、apache2が起動している)

アプリケーションからCtrl + Cを押しても明らかに終了しますが、直前に「文字列への接続」が出力されます。

私はこのサンプルを自分で作成し、同じ問題が発生しているかどうかを確認していますが、結果をここに必ず掲載します。誰かがこの問題に遭遇したか、またはこの動作を引き起こす可能性があることを知っていますか?

編集:
この例はうまく動作します...私はいくつかのデバッグを想定しています。

第2編集:
私はそれを得ることはできませんが、唯一の違いはホスト/ポートです。
例は、[]のchar *のARGVを使用し、私が使用しています:

char host[] = "localhost"; 
char port[] = "80"; 

第三編集:それは確かに接続でブロックしているように見える
は、(標準出力)をFFLUSHのを忘れていました。ソケットに問題がなければなりません。もう少しテストをするつもりです。

第4編集:
愚かな私は全くブロックしていませんでした!私はコンソール出力にあまりにも頼っていました。

答えて

3

これは、printfの後に接続するための呼び出しでおそらくブロックされています。

stdoutはデフォルトでバッファリングされており、printf文字列の最後に\ nがないため、その出力は表示されません。プログラムを終了すると、バッファがフラッシュされます。そのため、メッセージが表示されます。

+0

あなたが正しいです。それはソケットの問題でなければなりません。 –

+0

ソケットには問題はありませんが、出力を見ることでブロックされていると私は思っています。この回答は、私がそれを理解するのを助けました:) –

関連する問題