1

libcurlでlibuvを使用する方法の例からのサンプルコードを以下に示します

メイン関数は次のようになります。

int main(int argc, char **argv) {
    loop = uv_default_loop();

    if (argc <= 1)
        return 0;

    if (curl_global_init(CURL_GLOBAL_ALL)) {
        fprintf(stderr, "Could not init cURL\n");
        return 1;
    }

    uv_timer_init(loop, &timeout);

    curl_handle = curl_multi_init();
    curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
    curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);

    while (argc-- > 1) {
        add_download(argv[argc], argc);
    }

    uv_run(loop, UV_RUN_DEFAULT);
    curl_multi_cleanup(curl_handle);
    return 0;
}

イベントループを開始する方法について混乱しています。この行を実行すると

uv_run(loop, UV_RUN_DEFAULT);

ループには保留中のイベントがまったくないので、理論的にはループはすぐに終了するべきではありませんか?

コールバック handle_socket を実行するための変更は必要ありません。curl_perform()curl ソケット コールバックのコールバックで設定された が実行される可能性はありません。

私の理解に何か問題がありますか?

4

3 に答える 3

0

uv_timer_init(loop, &timeout)保留中のソケットではないため、アクティブではないため、UV ループをブロックしません (uv_handle_active を確認できcurl_multi_add_handleますstart_timeout) 。ループ後に移動するだけでテストでき、動作が停止します。timeouton_timeoutcurl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);add_download

于 2014-12-22T07:25:28.770 に答える
-1

非同期ウォッチャーを登録します。uv_async_initループを永久に強制するために使用します。次に、非同期コールバックですべての新しいリクエストを投稿して処理します。

于 2015-12-10T06:56:55.007 に答える