相关信息:GitHub上的3602问题
我正在开展一个收集和测试公共/免费代理的项目,并发现当我使用curl_multi接口测试这些代理时,有时会出现许多28(超时)错误。如果我单独测试每个代理,就不会出现这种情况。
问题在于,这个问题无法可靠地再现,并且它并不总是出现,可能是curl中的某些问题或其他问题。
不幸的是,我不是一个深入的网络调试器,我不知道如何在更深层次上调试这个问题,但是我编写了两个C测试程序(其中一个最初由Daniel Stenberg编写,但我修改了其输出格式与另一个C程序相同)。这两个C程序使用curl测试407个公共代理。
1.使用curl_multi接口进行测试(存在问题) 2.使用多个线程上的curl,每个curl在一个线程上运行。(没有问题) 这是我编写的两个C程序用于测试我不是C开发人员,因此请告诉我您在两个程序中注意到的任何错误。
为什么curl_multi在大多数连接上超时不一致,而curl-threads从未出现这种情况?
我下载了Wireshark并使用它来捕获两个C程序运行时的流量,我还将流量过滤到2个C程序使用的代理列表,并将文件保存在GitHub上。
问题在于,这个问题无法可靠地再现,并且它并不总是出现,可能是curl中的某些问题或其他问题。
不幸的是,我不是一个深入的网络调试器,我不知道如何在更深层次上调试这个问题,但是我编写了两个C测试程序(其中一个最初由Daniel Stenberg编写,但我修改了其输出格式与另一个C程序相同)。这两个C程序使用curl测试407个公共代理。
1.使用curl_multi接口进行测试(存在问题) 2.使用多个线程上的curl,每个curl在一个线程上运行。(没有问题) 这是我编写的两个C程序用于测试我不是C开发人员,因此请告诉我您在两个程序中注意到的任何错误。
这是我一个月前用来复现问题的原始PHP类。
这是两个C程序测试结果。您可以注意到使用curl_multi超时的测试,而由curl线程产生的超时是稳定的(约有407个代理中的50个正在工作)。
这是测试结果的示例。 请注意第4和第5列,看看curl线程大约超时了约170次并成功连接了约40次。其中,curl_multi没有成功连接,407个代理中超时了约300次。
column(1) : #
column(2) : time(UTC)
column(3) : total execution time (seconds)
column(4) : no error 0 (how many requests result in no error CURLE_OK)
column(5) : error 28 (how many requests result in error 28 CURLE_OPERATION_TIMEDOUT)
column(6) : error 7 (how many requests result in error 7 CURLE_COULDNT_CONNECT)
column(7) : error 35 (how many requests result in error 35 CURLE_SSL_CONNECT_ERROR)
column(8) : error 56 (how many requests result in error 56 CURLE_RECV_ERROR)
column(9) : other errors (how many requests result in errors other than the above)
column(10) : program that used the curl
column(11) : cURL version
c(1) c(2) c(3)c(4)c(5)c(6)c(7)c(8)c(9) c(10) c(11)
267 2019-3-28 01:58:01 40 43 176 183 1 4 0 C (curl - threads) (Linux Fedora) 7.59.0
268 2019-3-28 01:59:01 30 0 286 110 1 10 0 C (curl-multi one thread) (Linux Fedora) 7.59.0
269 2019-3-28 02:00:01 30 46 169 181 1 8 2 C (curl - threads) (Linux Fedora) 7.59.0
270 2019-3-28 02:01:01 31 0 331 74 1 1 0 C (curl-multi one thread) (Linux Fedora) 7.59.0
271 2019-3-28 02:02:01 30 42 173 186 1 4 1 C (curl - threads) (Linux Fedora) 7.59.0
272 2019-3-28 02:03:01 30 0 277 116 1 13 0 C (curl-multi one thread) (Linux Fedora) 7.59.0
为什么curl_multi在大多数连接上超时不一致,而curl-threads从未出现这种情况?
我下载了Wireshark并使用它来捕获两个C程序运行时的流量,我还将流量过滤到2个C程序使用的代理列表,并将文件保存在GitHub上。
curl-threads程序(预期行为)
407个代理中63个成功连接,158个连接超时。- 这是程序输出。
- 这是Wireshark .pcapng raw file。
curl_multi程序(不预期的行为)
407个代理中0个成功连接,272个连接超时。- 这是程序输出。
- 这是Wireshark.pcapng原始文件。
您可以使用Wireshark打开.pcapng
文件,并查看在我的计算机上记录的流量,同时包括预期/非预期的行为。我过滤了407个代理IP的流量,并在30秒的curl限制后将Wireshark保持打开状态一段时间,因为我注意到仍有一些数据包出现。我不懂Wireshark和这种网络层次,但我认为这可能会有用。
关于带宽的说明:
在Wireshark中打开curl_threads程序的.pcapng
文件(正常行为),并转到“统计”>“对话”。您将看到一个类似于这样的窗口
总和
。
正常工作所需的全部带宽约为692.8 KB。
CURLOPT_VERBOSE
。为了保持一致性,考虑使用 badger 在 GitHub 上提供的 C 版本。 - S.S. Annecurl
在一个线程上进行 1 次请求,它可以正常工作。但是curl_multi
仍然会产生28
超时错误,所以我不再使用它。 - Accountant م