2

背景:

我正在使用该库编写我的第一个 C 程序,我需要从发送到 SMTP 服务器的每个命令中收集响应。

我已经将命令发送到 SMTP 服务器并使用 打印响应标头curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, parse_head),但我使用的是多线程选项。当我得到响应时,根本不清楚它是由哪个命令引起的。我假设它们不一定会以发送的相同顺序收到。那是对的吗?

让它变得更加困难,因为库在没有我明确请求的情况下处理一些调用(比如设置初始连接),所以我需要处理比明确请求更多的标头。这将是可预测和可重复的,但肯定会增加额外的复杂性。

问题:

有没有一种“好”的方法来确定哪个命令使用多线程导致哪个响应标头?

另外,适度相关,库是否支持返回数字返回码,还是我必须手动解析出来?翻阅图书馆,似乎没有。我只是想确定一下。

4

1 回答 1

3

我假设它们不一定会以发送的相同顺序收到。那是对的吗?

是的。这就是多线程的工作原理。

有没有一种“好”的方法来确定哪个命令使用多线程导致哪个响应标头?

是的。您可以使用该选项设置用户数据(上下文信息,无论您如何称呼它)CURLOPT_HEADERDATA- 这将作为标题函数的第四个参数传入。所以你可以这样写代码:

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 回答