簡體   English   中英

boost::asio::ip::tcp::resolver::resolve() 永遠阻塞

[英]boost::asio::ip::tcp::resolver::resolve() blocks forever

我正在嘗試創建與 boost.asio 示例中的此代碼類似的內容。

套接字.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();
        }
};

套接字.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() 調用。
我已經為主機嘗試了“127.0.0.1”和“localhost”,為端口嘗試了“80”。 (不認為應該有關系,但 apache2 已啟動並運行)

當我 ctrl+c 退出我的應用程序時,它顯然會終止,但它會在 output 之前執行“連接到字符串”。

我計划自己構建示例並查看是否出現相同的問題,並且肯定會在此處發布結果。 有沒有人遇到過這個問題或知道什么可能導致這種行為?

編輯:
這個例子運行得很好......我想我有一些調試要做。

第二次編輯:
我不明白,唯一可能不同的是主機/端口。
示例使用 char* argv[] 我正在使用:

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

第三次編輯:
它確實似乎在連接時阻塞,忘記了 fflush(stdout)。 那么肯定是socket有問題了。 要做更多的測試。

第四次編輯:
愚蠢的我,它根本沒有阻塞。 我只是過於依賴控制台 output..

在 printf 之后,它可能阻塞了連接調用。

默認情況下,stdout 是行緩沖的,並且由於 printf 字符串的末尾沒有 \n,因此您將看不到它的 output。 當您終止程序時,緩沖區正在被刷新,這就是您看到該消息的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM