2

バックグラウンド:

ライブラリを使用して最初のCプログラムに取り組んでおり、SMTPサーバーに送信された各コマンドから応答を収集する必要があります。

SMTPサーバーにコマンドを送信し、を使用して応答ヘッダーを出力するところまで到達しましたcurl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, parse_head)が、マルチスレッドオプションを使用しています。どのコマンドが原因であるかという応答を受け取ったときは、まったくわかりません。必ずしも同じ順番で届くとは限らないと思います。あれは正しいですか?

ライブラリは明示的なリクエストなしで一部の呼び出し(初期接続の設定など)を処理するため、より困難になります。明示的なリクエストよりも多くのヘッダーを処理する必要があります。これは予測可能で再現性がありますが、間違いなく複雑さが増します。

質問:

マルチスレッドを使用して、どのコマンドがどの応答ヘッダーになったかを正確に判断する「良い」方法はありますか?

また、適度に関連していますが、ライブラリは数値のリターンコードを返すことをサポートしていますか、それとも手動で解析する必要がありますか?ライブラリを見ると、そうではないようです。確認したいだけです。

4

1 に答える 1

3

必ずしも同じ順番で届くとは限らないと思います。あれは正しいですか?

はい、そうです。これがマルチスレッドの仕組みです。

マルチスレッドを使用して、どのコマンドがどの応答ヘッダーになったかを正確に判断する「良い」方法はありますか?

はい。オプションを使用して、ユーザーデータ(コンテキスト情報、呼び出すものは何でも)を設定できますCURLOPT_HEADERDATA。これは、ヘッダー関数の4番目の引数として渡されます。したがって、次のようなコードを記述できます。

CURL *hndl = curl_easy_init();
// ... 
curl_easy_setopt(hndl, CURLOPT_HEADERFUNCTION, parse_head);
curl_easy_setopt(hndl, CURLOPT_HEADERDATA, some_pointer_that_identifies_the_thread);
// ...

size_t parse_head(void *buf, void *size_t sz, size_t nmemb, void *context)
{
    // context will be the pointer identifying the thread
}

ライブラリは数値のリターンコードを返すことをサポートしていますか、それとも手動で解析する必要がありますか?

はい、そうです:

long httpStatus;
curl_easy_getinfo(hndl, CURLINFO_RESPONSE_CODE, &httpStatus);
if (200 <= httpStatus && httpStatus < 300) {
    // HTTP 2XX OK
} else {
    // Error (4XX, 5XX) or redirect (3XX)
} 
于 2012-11-24T19:30:28.580 に答える