我正在制作一個小專案,我想使用 libcurl multi 一次請求多條資料。這是一個例子
CURL* array[] = {
curl_easy_init(),
curl_easy_init(),
curl_easy_init()
};
CURLM* multi = curl_multi_init();
curl_easy_setopt(array[0], CURLOPT_URL, "https://www.example.com/");
curl_easy_setopt(array[1], CURLOPT_URL, "https://www.example.com/");
curl_easy_setopt(array[2], CURLOPT_URL, "https://americas.api.riotgames.com/riot/account/v1/accounts/by-puuid/Dxon1TsoGLOAvUykGYErrEPAT_U9YkQ_jNFZpRxYpfRFwnaYVFULVshNQnZapa4qR_pe5sSBn5MQvw");
for (int i = 0; i < 3; i ) {
curl_multi_add_handle(multi, array[i]);
}
int retry = 3;
loop:
int run = 1;
while (run) {
CURLMcode mc = curl_multi_perform(multi, &run);
if (mc == CURLM_OK) {
mc = curl_multi_poll(multi, NULL, 0, 0, NULL);
}
if (mc != CURLM_OK) { // no else because catch both error possibilities
exit(0); // error in curl multi
}
}
CURLMsg *msg;
long rerun = 0;
int msgNum = 0;
while (msg = curl_multi_info_read(multi, &msgNum)) {
if (msg->msg == CURLMSG_DONE) {
if (msg->data.result != CURLE_OK) {
puts("ERROR");
exit(0); // error with transfer
}
long httpCode;
curl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE, &httpCode);
if (httpCode == 200) {
curl_multi_remove_handle(multi, msg->easy_handle);
} else { // error with serverside
rerun = httpCode;
printf("\nError : %d\n", rerun);
}
} else {
puts("ERROR");
exit(0); // return num not compelted?
}
}
puts("NExt");
if (rerun && --retry) {
printf("%d - %d\n", retry, rerun);
Sleep(1000);
goto loop;
}
puts("Finisheed");
exit(0);
所以首先我制作了一組 curl 簡單句柄,填寫所有資訊,然后將它們放入 curl_multi 以執行請求。如果我將所有 URL 設定為“https://www.example.com/”,代碼就可以正常作業。
但就我而言,我從一個可能根本不起作用的站點(陣列 [2] 中的 URL)發出請求,所以我做了一個重試機制。如果有一個不是 200 的 httpCode,那么我重做請求,但只使用失敗的請求(我洗掉了所有成功完成的簡單句柄)。
但是,重試機制似乎只重試一次(應該重試 3 次),并且似乎跳過了其余部分。這是我得到的輸出
...stuff from example.com...
Error : 401
NExt
2 - 401
NExt
Finisheed
如您所見,它只重試一次然后停止,但顯然存在錯誤,因為它沒有列印出正確的回應。
任何人都可以指出我正確的方向嗎?
uj5u.com熱心網友回復:
如果 curl easy 保存在 curl multi 中,則不會重新運行。洗掉并重新添加它。否則,您將在第二次迭代中獲得!run和!msg。
if (msg->msg == CURLMSG_DONE) {
// ...
curl_multi_remove_handle(multi, msg->easy_handle);
long httpCode;
curl_easy_getinfo(msg->easy_handle, CURLINFO_RESPONSE_CODE, &httpCode);
if (httpCode != 200) {
rerun = httpCode;
printf("\nError : %d\n", rerun);
curl_multi_add_handle(multi, msg->easy_handle);
}
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356311.html
