背景
我正在使用该库开发我的第一个C程序,我需要收集发送到SMTP服务器的每个命令的响应。
我已经将命令发送到SMTP服务器并使用curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, parse_head)
打印响应头,但我正在使用多线程选项。当我得到一个由它引起的命令的响应时,它一点也不清楚。我假设他们不一定会按照发送的相同顺序收到。这是对的吗?
让它变得更加困难,因为库在没有我的显式请求的情况下处理一些调用(比如设置初始连接),我需要处理比显式请求更多的头文件。这是可预测和可重复的,但肯定会增加额外的复杂程度。
问题:
是否有一种“好”的方法来确定哪个命令确实导致哪个响应头使用多线程?
此外,适度相关,库是否支持返回数字返回码,还是我必须手动解析它?透过图书馆看来,它似乎没有。我只是想确定一下。
答案 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)
}