当前位置:   article > 正文

【CURLE_RECV_ERROR】错误码解决_recv error

recv error

前言:

  年末出大坑,目前博主项目中对外提供的设备接口库涉及到网络通信,部分HTTP请求概率性出现【CURLE_RECV_ERROR】问题。博主使用的是libcurl第三方库进行http请求,由于网上没有查到相关资料,下面记录一下,本次问题分析和解决办法,希望能给其他人提供解决思路。

问题定位:

通过Wireshark抓包,我对比了正常时候的HTTP流和异常时候的HTTP流。

异常HTTP流

正常HTTP流

当出现【CURLE_RECV_ERROR】问题时,客户端向服务器发送POST请求,服务器未响应,6次TCP重传无响应后,【libcurl】判定HTTP数据接收失败。

我将数据包发聩给服务端研发人员,最后平台扩大了连接池设置予以解决。

容错方法

通过问题定位,已经能确定是服务器的问题,在问题还未解决的情况下,我这边找到一个容错方法,即CURL句柄先调用其它正常的接口后,再调用出问题的接口,能收到正常返回。

我这边贴上容错代码:

  1. QCARD_CURL *pHandle = (QCARD_CURL *)hCurlHandle;
  2. char pcUrlGetIssue[128] = {0}, pcParameter[1024] = {0};
  3. CURL *curl_handle = 0;
  4. CURLcode res = CURLE_OK;
  5. int ret = 0;
  6. sprintf(pcUrlGetIssue, "http://%s/fillqkey/distrQKeyByBlock", pHandle->pcSystenAddr);
  7. curl_handle = curl_easy_init();
  8. curl_easy_setopt(curl_handle, CURLOPT_URL, pcUrlGetIssue);//set down load url
  9. curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
  10. curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0);
  11. curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0);
  12. curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pHandle);//set download file
  13. curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, read_head_fun);//set call back fun
  14. curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L);//设定为不验证证书和host
  15. if(pHandle->uiTimeOut)
  16. {
  17. curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, pHandle->uiTimeOut);
  18. }
  19. sprintf(pcParameter, "deviceId=%s&unitId=%s&perBlockSeq=%d&devAuthCode=%s", pcStoreId, pcUnitId, *puiperBlockSeq, pcMacCode);
  20. curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, pcParameter);
  21. memset(pHandle->pcError, 0, sizeof(pHandle->pcError));
  22. /* 容错:CURLE_RECV_ERROR */
  23. if(1)
  24. {
  25. curl_easy_setopt(curl_handle, CURLOPT_URL, "http://112.27.xx.xxx:xxxxx/fillqkey/createFillQKeyTask");//set down load url
  26. res = curl_easy_perform(curl_handle);
  27. curl_easy_setopt(curl_handle, CURLOPT_URL, pcUrlGetIssue);//set down load url
  28. QCARD_FREE(pHandle->msg);
  29. }
  30. res = curl_easy_perform(curl_handle);
  31. if(res != CURLE_OK)
  32. {

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/968628
推荐阅读
相关标签
  

闽ICP备14008679号