CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

bash;collapse:true;;gutter:true; cmake_minimum_required(VERSION 3.11.2)</p> <p>project(work)</p> <p>message(STATUS "start load boost ========================================") BOOST</p> <h2>设置个变量控制</h2> <p>SET(BOOST_MIN_VERSION "1.67.0")</p> <h2>动态查找</h2> <p>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}")</p> <h2>头文件</h2> <p>INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) .BOOST message(STATUS "end load boost ========================================")</p> <p>编译google test,会在当前目录生成libtest.a静态库 add_subdirectory(lib/ext/googletest)</p> <h1>头文件</h1> <p>INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/include ${PROJECT_SOURCE_DIR}lib/ext/googletest/include)</p> <h1>库文件 : libtest.a 添加到链接路径中</h1> <p>link_directories(${PROJECT_SOURCE_DIR}/lib ${PROJECT_SOURCE_DIR}/lib/ext/googletest /usr/local/opt/curl/lib/)</p> <h1>编译器相关设置</h1> <p>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") # 调试信息 set(CMAKE_CXX_FLAGS "-Wall") # 开启所有警告 set(CMAKE_CXX_FLAGS "-lboost_date_time-mt-d") # boost</p> <h1>源码目录</h1> <p>FILE(GLOB_RECURSE SOURCEFILES ${PROJECT_SOURCE_DIR}/src/utility/<em>.cpp) FILE(GLOB_RECURSE TEST_SOURCEFILES ${PROJECT_SOURCE_DIR}/src/test/</em>.cpp)</p> <p>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})</p> <p>target_link_libraries(${PROJECT_NAME} gtest ${Boost_LIBRARIES} curl) target_link_libraries(work_test gtest ${Boost_LIBRARIES} curl)</p> <pre><code> 使用 设定头部文件: ![CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/152332-20180606180615277-1867635669.png) ;collapse:true;;gutter:true;
//
// Created by Zhou,Baochuan on 18/6/5.

//

#ifndef WORK_HTTP_H
#define WORK_HTTP_H

#include "common.h"
#include

namespace work {
class Http {
public:
Http();
~Http();
static string get(string url, unsigned retries = 3);
};
}

#endif //WORK_HTTP_H

注意:get方法中增加了retries重试机制。在实现中看一下细节!

CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

cpp;collapse:true;;gutter:true; // // Created by Zhou,Baochuan on 18/6/5.</p> <p>//</p> <h1>include "http.h"</h1> <p>using namespace work;</p> <p>Http::Http() { curl_global_init(CURL_GLOBAL_NOTHING); }</p> <p>Http::~Http() { curl_global_cleanup(); }</p> <p>size_t req_reply(void<em> ptr, size_t size, size_t nmemb, void</em> stream) { //cout << "----->reply" << endl; std::string<em> str = (std::string</em>)stream; //cout << <em>str << endl; (</em>str).append((char<em>)ptr, size * nmemb); return size * nmemb; } string Http::get(string url, unsigned int retries) { string response; CURL </em>curl; struct curl_slist *headers = NULL; //headers = curl_slist_append(headers, "Accept: Agent-007");</p> <pre><code>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); // 传输超时 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 0); // 连接超时 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); CURLcode res = curl_easy_perform(curl); // 执行 // 重试 while (res != CURLE_OK && --retries > 0) { res = curl_easy_perform(curl); // 执行 } curl_easy_cleanup(curl); } curl_slist_free_all(headers); return response; </code></pre> <p>}</p> <pre><code> 测试代码: ![CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/152332-20180606181026310-259292454.png) ;collapse:true;;gutter:true;
#include "common.h"
#include "http.h"
#include

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 注意事项

1、解决线程安全及避免core错误问题方式

1) curl_global_init()在多线程环境下,是线程不安全的。所以在多线程环境下,要在主线程中调用这个方法。配套的,在主线程中调用curl_global_cleanup()方法。

2)curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); 控制域名解析的超时,其需要一个sigjmp_buf型的全局变量,多线程时会修改它。

3) curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1);默认情况下libcurl完成一个任务以后,出于重用连接的考虑不会马上关闭。如果没有新的TCP请求来重用这个连接,那么只能等到CLOSE_WAIT超时,这个时间默认在7200秒甚至更高,太多的CLOSE_WAIT连接会导致性能问题

2、要想让curl_easy_perform(),能够执行,必须得有个配套方法curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);

Original: https://www.cnblogs.com/baochuan/p/9141712.html
Author: 川山甲
Title: CLion之C++框架篇-优化开源框架,引入curl,实现get方式获取资源(四)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535590/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++中的三种继承关系

    先看类中声明成员时的三种访问权限 public : 可以被任意实体访问 protected : 只允许子类及本类的成员函数访问 private : 只允许本类的成员函数访问 在类继…

    C++ 2023年5月29日
    074
  • (转载)C++lambda表达式

    C++ 语言中的lambda表达式在很多情况下提供了函数对象的另一种实现机制。Lambda表达式并不是STL所特有的,但它广泛应用于这一环境中。Lambda是表达式是定义一个没有名…

    C++ 2023年5月29日
    074
  • Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

    在windows下使用pip安装包的时候提示报错:Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.ba…

    C++ 2023年5月29日
    088
  • 2022年十三届蓝桥杯国赛将至,来看看去年蓝桥杯C++b组国赛题目如何

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    C++ 2023年5月29日
    066
  • 逆向初级-C++(三)

    1、什么是封装:将函数定义到结构体内部,就是封装。2、什么是类:带有函数的结构体,称为类。3、什么是成员函数:结构体里面的函数,称为成员函数。 #include #include …

    C++ 2023年5月29日
    066
  • C++11 列表初始化

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于…

    C++ 2023年5月29日
    059
  • C++17新特性

    C++17新特性 前言 If Statements with Initializer Constexpr if inline 变量 嵌套命名空间 属性说明符 [[fallthrou…

    C++ 2023年5月29日
    057
  • 右值引用与转移语义(C++11)

    参考资料: 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的 左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对…

    C++ 2023年5月29日
    073
  • c++11 auto 与 decltype 详解

    一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问…

    C++ 2023年5月29日
    068
  • [C++] 引用类型&

    引用的方法: 类型 &引用名 = 变量名; 例如: int a = 5; int &b = a; 引用的规则: 1、引用被创建的同时必须被初始化 2、无null引用…

    C++ 2023年5月29日
    063
  • VC++之自定义消息

    用户可以自定义消息,在应用程序中主动发出,这种消息一般用于应用程序的某一部分内部处理。 实例说明: 当用户按键盘上的光标上移键时,程序发送用户自定义消息,在对应的消息响应函数中弹出…

    C++ 2023年5月29日
    067
  • (筆記) 如何讀取binary file某個byte的值? (C/C++) (C)

    Abstract通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行讀取。 In…

    C++ 2023年5月29日
    060
  • c++报错: No viable overloaded ‘=’ 临时变量与引用参数 const

    对于一个函数的参数为引用,如果想接收临时变量,就必须加上 const。 class A{ public: A(int aa) {} }; void f(A& a) { };…

    C++ 2023年5月29日
    062
  • C/C++定义全局变量/常量几种方法的区别

    在讨论全局变量之前我们先要明白几个基本的概念: 编译单元(模块):在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK…

    C++ 2023年5月29日
    078
  • [招聘]高级软件工程师(C/C++), 惠州大亚湾,BYD

    岗位职责: 参与工业基础软件技术方案的调研,制定软件模块方案 开发基于Linux的工控自动化通用平台软件模块 相关技术文档的编写 其他相关的工作任务 任职要求:1. 3 年以上 C…

    C++ 2023年5月29日
    079
  • A Complete Guide to Programming in C++ 笔记

    1.c++程序编译过程。包括两个阶段,compiler和linker。第一个阶段compiler是把c++文件编译成obj文件。第二个阶段是linker把多个obj文件和lib文件…

    C++ 2023年5月29日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球