libcurl库是否提供了确定哪个响应头来自哪个命令的方法?

时间:2012-11-24 19:20:39

标签: c multithreading curl libcurl

背景

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

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

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

问题:

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

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

1 个答案:

答案 0 :(得分: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)
}