<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      川山甲

      追求內(nèi)心的非常平靜!瞬間清空所有的雜念,達(dá)到物我兩忘!

        博客園  :: 首頁  ::  :: 聯(lián)系 :: 訂閱 訂閱  :: 管理
       
      背景
       
        結(jié)合上一篇CLion之C++框架篇-優(yōu)化框架,引入boost(三),繼續(xù)進(jìn)行框架優(yōu)化!在項(xiàng)目中,我們經(jīng)常會(huì)通過get方式拉取第三方資源,這一版優(yōu)化引入類庫curl,用來拉取第三方資源庫。
       
        開源框架代碼:https://github.com/rtxbc/cplus/tree/master/work
       
      配置使用
       
        
      cmake_minimum_required(VERSION 3.11.2)
      
      project(work)
      
      message(STATUS "start load boost ========================================")
      # BOOST
      ## 設(shè)置個(gè)變量控制
      SET(BOOST_MIN_VERSION "1.67.0")
      ## 動(dòng)態(tài)查找
      FIND_PACKAGE(Boost ${BOOST_MIN_VERSION} REQUIRED)
      if(NOT Boost_FOUND)
          message(FATAL_ERROR "Fatal error:Boost (version >=${BOOST_MIN_VERSION}) required.\n")
      endif()
      message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
      message(STATUS "Boost_LIBRARIES: ${BOOST_LIBRARY_DIRS}")
      message(STATUS "Boost_VERSION: ${Boost_VERSION}")
      ## 頭文件
      INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
      LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
      # .BOOST
      message(STATUS "end load boost ========================================")
      
      
      # 編譯google test,會(huì)在當(dāng)前目錄生成libtest.a靜態(tài)庫
      add_subdirectory(lib/ext/googletest)
      
      #頭文件
      INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/include ${PROJECT_SOURCE_DIR}lib/ext/googletest/include)
      
      
      #庫文件 : libtest.a 添加到鏈接路徑中
      link_directories(${PROJECT_SOURCE_DIR}/lib ${PROJECT_SOURCE_DIR}/lib/ext/googletest /usr/local/opt/curl/lib/)
      
      #編譯器相關(guān)設(shè)置
      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/output/bin")
      set(LIBRARIES pthread)
      set(CMAKE_CXX_STANDARD 11)
      set(CMAKE_CXX_COMPILER      "clang++" )         # 顯示指定使用的C++編譯器
      set(CMAKE_CXX_FLAGS   "-g")                     # 調(diào)試信息
      set(CMAKE_CXX_FLAGS   "-Wall")                  # 開啟所有警告
      set(CMAKE_CXX_FLAGS   "-lboost_date_time-mt-d") # boost
      
      #源碼目錄
      FILE(GLOB_RECURSE SOURCEFILES ${PROJECT_SOURCE_DIR}/src/utility/*.cpp)
      FILE(GLOB_RECURSE TEST_SOURCEFILES ${PROJECT_SOURCE_DIR}/src/test/*.cpp)
      
      add_custom_target(cmake-build-debug)
      add_executable(${PROJECT_NAME} ${PROJECT_SOURCE_DIR}/src/main/main.cpp ${SOURCEFILES})
      add_executable(work_test ${TEST_SOURCEFILES} ${SOURCEFILES})
      
      target_link_libraries(${PROJECT_NAME} gtest ${Boost_LIBRARIES} curl)
      target_link_libraries(work_test gtest ${Boost_LIBRARIES} curl)
      

        

      使用
       
      設(shè)定頭部文件:
       

       

      //
      // Created by Zhou,Baochuan on 18/6/5.
      //
      
      #ifndef WORK_HTTP_H
      #define WORK_HTTP_H
      
      #include "common.h"
      #include <curl/curl.h>
      
      namespace work {
          class Http {
          public:
              Http();
              ~Http();
              static string get(string url, unsigned retries = 3);
          };
      }
      
      #endif //WORK_HTTP_H
      

        

      注意:get方法中增加了retries重試機(jī)制。在實(shí)現(xiàn)中看一下細(xì)節(jié)!

       

      //
      // Created by Zhou,Baochuan on 18/6/5.
      //
      
      #include "http.h"
      
      using namespace work;
      
      Http::Http()
      {
          curl_global_init(CURL_GLOBAL_NOTHING);
      }
      
      Http::~Http()
      {
          curl_global_cleanup();
      }
      
      size_t req_reply(void* ptr, size_t size, size_t nmemb, void* stream) {
          //cout << "----->reply" << endl;
          std::string* str = (std::string*)stream;
          //cout << *str << endl;
          (*str).append((char*)ptr, size * nmemb);
          return size * nmemb;
      }
      string Http::get(string url, unsigned int retries)
      {
          string response;
          CURL *curl;
          struct curl_slist *headers = NULL;
          //headers = curl_slist_append(headers, "Accept: Agent-007");
      
          curl = curl_easy_init() ;
          if (curl) {
              //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
              curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
              curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
              curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);
              curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*) &response);
              //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
              curl_easy_setopt(curl, CURLOPT_TIMEOUT, 0); // 傳輸超時(shí)
              curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 0); // 連接超時(shí)
              curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
              curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1);
              CURLcode res = curl_easy_perform(curl);   // 執(zhí)行
      
              // 重試
              while (res != CURLE_OK && --retries > 0) {
                  res = curl_easy_perform(curl);   // 執(zhí)行
              }
      
              curl_easy_cleanup(curl);
          }
          curl_slist_free_all(headers);
          return response;
      }
      

        

      測試代碼:

       

      #include "common.h"
      #include "http.h"
      #include <gtest/gtest.h>
      
      using namespace work;
      
      // curl版本要求
      TEST(curl, all)
      {
          EXPECT_EQ(3, CURLVERSION_NOW);
          Http http;
          string url = "http://47.95.220.249/";
          ASSERT_FALSE(http.get(url).empty());
      }
      

        

       

      CURL 注意事項(xiàng)
       

       1、解決線程安全及避免core錯(cuò)誤問題方式

        1) curl_global_init()在多線程環(huán)境下,是線程不安全的。所以在多線程環(huán)境下,要在主線程中調(diào)用這個(gè)方法。配套的,在主線程中調(diào)用curl_global_cleanup()方法。

        2)curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); 控制域名解析的超時(shí),其需要一個(gè)sigjmp_buf型的全局變量,多線程時(shí)會(huì)修改它。

        3)  curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1);默認(rèn)情況下libcurl完成一個(gè)任務(wù)以后,出于重用連接的考慮不會(huì)馬上關(guān)閉。如果沒有新的TCP請(qǐng)求來重用這個(gè)連接,那么只能等到CLOSE_WAIT超時(shí),這個(gè)時(shí)間默認(rèn)在7200秒甚至更高,太多的CLOSE_WAIT連接會(huì)導(dǎo)致性能問題

       2、要想讓curl_easy_perform(),能夠執(zhí)行,必須得有個(gè)配套方法curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);

       
       
      推薦
      posted on 2018-06-06 18:29  川山甲  閱讀(3314)  評(píng)論(2)    收藏  舉報(bào)
      主站蜘蛛池模板: 无码少妇一区二区| 中文字幕av无码免费一区| 人成午夜免费大片| 99久久激情国产精品| 国产无遮挡又黄又爽不要vip软件| 国产99久久无码精品| 蜜桃成人无码区免费视频网站| 亚洲 制服 丝袜 无码| 樱桃视频影院在线播放| 国产精品亚洲а∨天堂2021| 美女午夜福利视频一区二区| 武义县| 久久精品日日躁夜夜躁| 国产高清在线精品一本大道| 精品 无码 国产观看| 风流少妇树林打野战视频| 亚洲综合精品第一页| 亚洲精品午夜精品| 国产成人久久综合一区| 国产美女高潮流白浆视频| 国产精品九九久久精品女同| 日韩大片高清播放器| 国产日女人视频在线观看| 性一交一乱一伦| 桂平市| 伊人欧美在线| 亚洲欧美综合精品成人网站| 亚洲老熟女一区二区三区| 少妇被粗大猛进进出出| 国产亚洲欧洲av综合一区二区三区| 91久久天天躁狠狠躁夜夜| 久久无码高潮喷水| 成人亚欧欧美激情在线观看| 在线精品亚洲区一区二区| 人妻少妇久久中文字幕一区二区| 亚洲最大天堂在线看视频| 成熟了的熟妇毛茸茸| 久久99国产一区二区三区| 国产精品自在线拍国产手机版| 日本一高清二区视频久二区 | 亚洲精品免费一二三区|