C++如何使用libcurl发送post请求的三种content-type的封装

2023-05-16

作者:虚坏叔叔
博客:https://xuhss.com

早餐店不会开到晚上,想吃的人早就来了!😄

C++如何使用libcurl发送post请求的三种content-type的封装

C++如何使用libcurl发送post请求的3中content-type的封装。

我们知道http协议的post请求的content-type有三种方式,其他语言都能很方便的设置,那么c++如何实现post请求不同content-type的请求能,下面封装好了大家需要可以直接拿

里面用到的json库可以参照这篇文章C++ Json解析库CJsonObject的详细使用(跨平台无须编译成库)

一、以下是封装好的http请求类(get/post)

下面封装了http请求工具类,在外部直接调用此类即可

HttpLink.h

//********************************************************************
//    
//    @copyright      www.xuhss.com
//    @version        v1.0
//    @file           www.xuhss.com
//    @author         w
//    @date           202/1/21 15:01
//    @brief          连接服务端
//*********************************************************************

#pragma once

#include "..\..\..\ThridLibrary\curl-7.62.0\include\curl\curl.h"
#pragma comment(lib, "libcurl.lib")

class CHttpLink
{
public:
	CHttpLink();
	~CHttpLink();

	/**
	*  @brief    使用Post 用http连接服务端
	*
	*  @param    const std::string &url	网址
	*  @param    const std::string &postParams	param参数
	*  @param    int nPort	端口
	*  @param    std::string &strResponse	返回值
	*  @param    std::list<std::string> listRequestHeader	请求头
	*  @param    bool bResponseIsWithHeaderData	是否带请求头
	*  @param    int nConnectTimeout
	*  @param    int nTimeout
	*  @return   CURLcode
	*/
	CURLcode CurlPostRequst(const std::string &url, const std::string &strParams, int nPort, 
		std::string &strResponse, std::list<std::string> listRequestHeader,
		bool bResponseIsWithHeaderData = false, int nConnectTimeout = 10, int nTimeout = 10);

	/**
	*  @brief    使用Post 用http连接服务端
	*
	*  @param    const std::string &url	网址
	*  @param    std::string &strResponse	返回值
	*  @param    int nPort	端口
	*  @param    std::list<std::string> listRequestHeader	请求头
	*  @param    bool bResponseIsWithHeaderData	是否带请求头
	*  @param    int nConnectTimeout
	*  @param    int nTimeout
	*  @return   CURLcode
	*/
	CURLcode CurlGetRequst(const std::string &url, std::string &strResponse,
		int nPort, std::list<std::string> listRequestHeader,
		bool bResponseIsWithHeaderData = false, int nConnectTimeout = 10, int nTimeout = 10);
};


HttpLink.cpp

#include "StdAfx.h"
#include "HttpLink.h"


CHttpLink::CHttpLink()
{
}


CHttpLink::~CHttpLink()
{
}

size_t WriteData(void *buffer, size_t size, size_t nmemb, void *userp)
{
	std::string* str = dynamic_cast<std::string*>((std::string *)userp);
	if (NULL == str || NULL == buffer)
	{
		return -1;
	}

	char* pData = (char*)buffer;
	str->append(pData, size * nmemb);
	return nmemb;
}

CURLcode CHttpLink::CurlPostRequst(const std::string &url, const std::string &strParams, int nPort,
	std::string &strResponse, std::list<std::string> listRequestHeader,
	bool bResponseIsWithHeaderData/* = false*/, int nConnectTimeout/* = 10*/, int nTimeout/* = 10*/)
{
	// 初始化  
	CURL *curl = curl_easy_init();
	struct curl_httppost* post = NULL;
	struct curl_httppost* last = NULL;

	// 返回值
	CURLcode res;
	if (curl)
	{
		// set params  
		// 1为Post,0为Get方式  
		curl_easy_setopt(curl, CURLOPT_POST, 1); 

		// 设置网址
		curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url  

		// 设置端口
		curl_easy_setopt(curl, CURLOPT_PORT, nPort);    //port

		//构建HTTP报文头
		struct curl_slist* headers = NULL;
		if (listRequestHeader.size() > 0)
		{
			std::list<std::string>::iterator iter, iterEnd;
			iter = listRequestHeader.begin();
			iterEnd = listRequestHeader.end();
			for (iter; iter != iterEnd; iter++)
			{
				headers = curl_slist_append(headers, iter->c_str());
			}
			if (headers != NULL)
			{
				//设置http请求头信息
				curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
			}
		}
		else
		{
			headers = curl_slist_append(headers, "Content-Type:application/x-www-form-urlencoded");
			if (headers != NULL)
			{
				//设置http请求头信息
				curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
			}
		}

		// 设置param参数
		curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strParams.c_str()); 

		// 构造post参数 (表单的形式)
//		curl_formadd(&post, &last, CURLFORM_PTRNAME, "materialistid{}", CURLFORM_PTRCONTENTS, strParams, CURLFORM_END);
//		curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);                     

		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //返回的头部中有Location(一般直接请求的url没找到),则继续请求Location对应的数据 
		curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);

		// 回调函数
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData);

		// 获取返回数据
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);

		//响应体中是否包含了头信息
		if (bResponseIsWithHeaderData)
		{
			curl_easy_setopt(curl, CURLOPT_HEADER, 1);
		}
		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, nConnectTimeout);
		curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeout);
		
		// 开始连接
		res = curl_easy_perform(curl);
		if (headers != NULL)
		{
			curl_slist_free_all(headers); //free the list again
		}
	}
	
	//清理
	curl_easy_cleanup(curl);
	return res;
}

CURLcode CHttpLink::CurlGetRequst(const std::string &url, std::string &strResponse,
	int nPort, std::list<std::string> listRequestHeader,
	bool bResponseIsWithHeaderData/* = false*/, int nConnectTimeout/* = 10*/, int nTimeout/* = 10*/)
{
	// init curl  
	CURL *curl = curl_easy_init();
	// res code  
	CURLcode res;
	if (curl)
	{
		// set params  
		curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // url  
		curl_easy_setopt(curl, CURLOPT_PORT, 18080);    //port
		curl_easy_setopt(curl, CURLOPT_POST, 0); // get reqest 
	//构建HTTP报文头
		struct curl_slist* headers = NULL;
		if (listRequestHeader.size() > 0)
		{
			std::list<std::string>::iterator iter, iterEnd;
			iter = listRequestHeader.begin();
			iterEnd = listRequestHeader.end();
			for (iter; iter != iterEnd; iter++)
			{
				headers = curl_slist_append(headers, iter->c_str());
			}
			//headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
				//headers = curl_slist_append(headers, "Content-Type:application/x-www-form-urlencoded");
			if (headers != NULL)
			{
				curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);//设置http请求头信息
			}
		}
//		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); // if want to use https  
//		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); // set peer and host verify false  
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse);
		curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
		if (bResponseIsWithHeaderData)
		{
			curl_easy_setopt(curl, CURLOPT_HEADER, 1);//响应体中是否包含了头信息,比如Content-Type:application/json;charset=UTF-8
		}
		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, nConnectTimeout); // set transport and time out time  
		curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeout);
		// start request  
		res = curl_easy_perform(curl);
		if (headers != NULL)
		{
			curl_slist_free_all(headers); //free the list again
		}
	}
	// release curl  
	curl_easy_cleanup(curl);
	return res;
}

二、调用HttpLink post的三种content-type

2.1 Content-Type:application/x-www-form-urlencoded

	std::string strUser, strPass;
	strUser = CT2A(strUserName.GetBuffer());
	strPass = CT2A(strPossWord.GetBuffer());
	strUserName.ReleaseBuffer();
	strPossWord.ReleaseBuffer();
	std::string strLoginParam = "username=";
	strLoginParam += strUser;
	strLoginParam += "&password=";
	strLoginParam += strPass;

	std::string strResponse;
	std::list<std::string> listRequestHeader;
	listRequestHeader.push_back("Content-Type:application/x-www-form-urlencoded");

	CHttpLink httpLink;
	httpLink.CurlPostRequst(_strURL, strLoginParam, _nPort, strResponse, listRequestHeader, true);

	// 从返回值中截取token值
	std::string strError = GetTokenFromStr(strResponse, _strToken);
	if (!strError.empty())
	{
		CString strWError = strError.c_str();
		MessageBox(strWError, _T("提示"), MB_OK | MB_ICONINFORMATION);
		return;
	}
	else
	{

	}

2.2 Content-Type:application/json;charset=UTF-8

	// 构建json数据作为param传递
	cJSON *pJson = cJSON_CreateObject();

	//创建一个整型数组
	cJSON *pIntArr = cJSON_CreateArray();

	cJSON *n = 0, *p = 0, *a = cJSON_CreateArray();
	int nCount = (int)nArr.size();
	for (int i = 0; a && i<nCount; i++)
	{
		n = cJSON_CreateDouble((long double)((unsigned int)nArr[i]), 1);
		//n = cJSON_CreateNumber(nArr[i]);
		if (!i)
			a->child = n;
		else
		{
			p->next = n;
			n->prev = p;
		}
		p = n;
	}

	cJSON_AddItemToObject(pJson, "materialistid", a);
	char *json_data = cJSON_Print(pJson);

	// 构建网址
	std::string strRespose;
	std::string strUrl = BuildUrl(_strIP, _strPort, _strPrefix, _strController);

	std::list<std::string> listRequestHeader;
	listRequestHeader.push_back("Content-Type:application/json;charset=UTF-8");
	listRequestHeader.push_back(strToken);
	listRequestHeader.push_back("endPointType:ROLE_DEVELOP");

	CHttpLink httpLink;
	httpLink.CurlPostRequst(strUrl, json_data, _nPort, strRespose, listRequestHeader, true);

	// 截取Json数据
	CStringA strJsonData = InterceptJsonDataFromStr(strRespose);
	const char* result = new char[2 * strJsonData.GetLength() + 1];
	cJSON* cjson = cJSON_Parse(strJsonData, &result);
	delete[] result;
	if (cjson == NULL || cjson->type == cJSON_NULL)
		return;

	// 获取结果
	cJSON* pResultArr = cJSON_GetObjectItem(cjson, "result");
	if (NULL == pResultArr || pResultArr->type == cJSON_NULL)
		return;

	int nSize = cJSON_GetArraySize(pResultArr);
	cJSON* pSubItem = pResultArr->child;
	for (int i = 0; i < nSize; ++i)
	{
		cJSON* pSubChildItem = pSubItem->child;
		int nLength = cJSON_GetArraySize(pSubItem);
		MatDataValue dataValue;
		for (int j = 0; j < nLength; ++j)
		{
			CVariantData variantData = BuildVariantData(pSubChildItem);

			CString strKey = UTF8StdstringToCString(pSubChildItem->string);
			dataValue.keyValueMap[strKey] = variantData;
			pSubChildItem = pSubChildItem->next;
		}

		_matDataValueArr.push_back(dataValue);
		pSubItem = pSubItem->next;
	}

	cJSON_Delete(cjson);

2.3 Content-Type: multipart/form-data

void CDlgStandardResultApply::UploadFile(std::string& strUrl, std::string& strFilePath, std::string& strResult)
{
	std::string stdXmCode = CW2A(_strXmCode.GetString());
	std::string stdPrjCode = CW2A(_strPrjCode.GetString());	

	std::string strError;
	CString strResponseValue;

	CURL *curl;
	CURLcode res;
	curl = curl_easy_init();
	if (curl) {
		curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
		curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
		curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
		curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
		struct curl_slist *headers = NULL;
		headers = curl_slist_append(headers, "Content-Type: multipart/form-data");
		headers = curl_slist_append(headers, "endPointType: web");
		headers = curl_slist_append(headers, _strToken.c_str());
		headers = curl_slist_append(headers, "Cookie: JSESSIONID=82E632D537D25075EDD98E6BE1ADF0F7");
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
		curl_mime *mime;
		curl_mimepart *part;
		mime = curl_mime_init(curl);
		part = curl_mime_addpart(mime);
		curl_mime_name(part, "file");
		curl_mime_filedata(part, strFilePath.c_str());
		part = curl_mime_addpart(mime);
		curl_mime_name(part, "resultid");
		curl_mime_data(part, strResult.c_str(), CURL_ZERO_TERMINATED);
		part = curl_mime_addpart(mime);
		curl_mime_name(part, "projectCode");
		curl_mime_data(part, stdXmCode.c_str(), CURL_ZERO_TERMINATED);
		part = curl_mime_addpart(mime);
		curl_mime_name(part, "itemProjectCode");
		curl_mime_data(part, stdPrjCode.c_str(), CURL_ZERO_TERMINATED);
		curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);

		std::string stdResponse; // post返回后的数据
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);          //绑定相应
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stdResponse);

		res = curl_easy_perform(curl);
		curl_mime_free(mime);
	
		strResponseValue = CA2W(stdResponse.c_str(), CP_UTF8);
	}
	curl_easy_cleanup(curl);

	if (res != CURLE_OK)
	{
		strError = curl_easy_strerror(res);
		return;
	}

	CString strKey = L"code";
	std::string stdKey = CW2A(strKey);
	std::string stdResValue = CW2A(strResponseValue);
	std::string stdResultCode;
	
	strError = GetJsonResultFromStr(stdResValue, stdResultCode, stdKey);
	if (!strError.empty())
	{
		CString strWError = strError.c_str();
		MessageBox(strWError, _T("提示"), MB_OK | MB_ICONINFORMATION);
		return;
	}

	CString strResuult = CA2W(stdResultCode.c_str(), CP_UTF8);
	if (L"0" != strResuult)
		return;
	
	CString strErrorInfo = L"上传成功!";
	MessageBox(strErrorInfo, _T("提示"), MB_OK | MB_ICONINFORMATION);
}

三、总结

  • 本文主要介绍C++如何使用libcurl发送post请求的3中content-type的封装
  • 如果觉得文章对你有用处,记得 点赞 收藏 转发 一波哦~

💬 往期优质文章分享

  • C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
  • 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  • 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
  • Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
  • Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)

🚀 优质教程分享 🚀

  • 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 🎄比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
  • 🎄可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战 💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️难度偏高分享学习QT成品的视频播放器源码,需要有扎实的C++知识!
💚 游戏爱好者九万人社区💚互助/吹水九万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Python零基础到入门 💙Python初学者针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门

🚀 资料白嫖,温馨提示 🚀

关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++如何使用libcurl发送post请求的三种content-type的封装 的相关文章

  • eagle使用注意点

    使用eagle也有快一年时间了 xff0c 刚开始很不习惯 xff0c 后来习惯了也还可以 xff0c 这里我举出几个设计中经常出错的地方 xff1a 1 PCB翻转问题 xff1a 在翻转PCB文件时一定要打开torigin borigi
  • 自制pixhawk电脑不识别com口

    在原版pix上面进行改版很方便 xff0c 可以去除很多不必要的电路 笔者将电源管理芯片去除 xff0c 5V来源于变压器输出或者是连接电脑时的USB供电 xff0c 并将它们并联起来 xff0c 但是板子做回来焊接后发现问题如下 xff1
  • eagle pcb v8.2 便捷性大大提升

    eagle pcb在被Autodesk收购之前是7 x版本 xff0c 但是却有一些一直被吐槽的东西 xff0c 说实话这些东西确实增加了布线难度 xff0c 增加了布板时间 xff1a 1 real time DRC xff1a 在7 x
  • Ubuntu firefox 显示在运行无法打开,如何在终端关闭进程

    用top命令找不到firfox的进程 xff0c 查看某个用户运行的进程 xff1a ps u username grep eclipse 查看用户名为 xff1a username 的用户是否运行了eclipse 查看用户当前运行fire
  • 【万字详解】cJSON解析

    目录 1 通过README文件 xff0c 初步了解cJSON xff1a 1 1 头文件的开头和结尾 xff1a 1 2 头文件关于cJSON类型的宏定义 1 3 头文件中的extern 2 阅读并且分析cJSON源码 2 1 结构体st
  • VINS-mono 解析 新特征

    在17 12 29 xff0c VINS更新了代码加入了新的特征 xff0c 包括map merge 地图合并 pose graph reuse 位姿图重利用 online temporal calibration function 在线时
  • VINS-mono 位姿图 重利用测试

    在前一篇博文里介绍了VINS mono pose graph reuse功能的使用 xff0c 这里接着贴出一些延伸的测试 xff0c 并进行一些探讨 延伸测试 一般来说 xff0c 加载地图是进行非GPS定位必要的一步 这里根据新的VIN
  • 2022年全国大学生电子设计大赛省赛A题

    2022年全国大学生电子设计大赛省赛A题 交流电子负载 文章目录 2022年全国大学生电子设计大赛省赛A题 交流电子负载 前言一 总体思路二 模块设计1 半桥模块2 测量模块3 辅助电源模块 三 主电路搭建总结 前言 2022年全国大学生电
  • linux下使用shell发送http请求

    一 curl 1 get请求 curl命令默认下就是使用get方式发送http请求 curl www baidu com 2 post请求 使用 d参数 xff0c 形式如下 xff1a curl d 34 param1 61 value1
  • 网络摄像头 接口协议 ONVIF,PSIA,CGI,ISAPI

    ONVIF致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用 xff0c 这一接口标准将确保不同厂商生产的网络视频产品具有互通性 2008年11月 xff0c 论坛正式发布了ONVIF第一版规范 ONVIF核心规范1 0 随着视频
  • VLC架构及流程分析

    注明 xff1a 此文为转载 原文地址 xff1a https jiya io archives vlc learn 2 html 由于本人之前由于在工作中需要对VLC进行二次开发 因此进行了相关工作的开发 xff08 由于工作原因 目前暂
  • 学习、使用C++开发是不是过时了?

    C 43 43 在开发过程中真心很尴尬 1 拿相同薪水使用不同语言的程序员 xff0c 开发大多数相同的常见业务需求 xff0c C 43 43 总是进度较慢 xff08 不考虑时 空复杂性及效率 xff09 2 扩展性 跨平台 资源 内存
  • strcat()函数的用法

    这几天的一次程序练习中用到了strcat 函数 xff0c 但也想到了一些问题 我们都知道strcat str ptr 是将字符串ptr内容连接到字符串str后 xff0c 然后得到一个组合后的字符串str xff0c 比如 str字符串内
  • libQtCore.so.4 undefined symbol :g_main_context_push_thread_default

    开发板终端执行qt程序 qtDemo qws 报错 xff1a libQtCore so 4 undefined symbol g main context push thread default 解决方案 xff1a cd DVSDK p
  • curl时设置Expect的必要性

    curl 在项目中使用频率较高 xff0c 比如内部接口 第三方 api 图片存储服务等 xff0c 但是我们在使用 curl 时可能并没有注意到 Expect 这个请求头信息 xff0c 而 Expect 设置不正确 xff0c 会导致不
  • 奇偶校验原理

    奇校验 xff1a 求一个字节8位中 1 的个数 xff0c 添加一位校验位 xff0c 使9位中 1 的个数为奇数 xff1b 偶校验同理 奇校验就是让原有数据序列中 xff08 和要加上的一位 xff09 1的个数为奇数 如010001
  • CreateMutex函数函数用来实现进程互斥

    CreateMutex函数 正常情况下 xff0c 一个进程的运行一般是不会影响到其他正在运行的进程的 但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的 xff0c
  • C++与QML交互总结

    一直对于QT的理解和使用都停留在主窗口程序和控制台程序 xff0c 虽然QT的新东西QML听过也接触过 xff0c 但是基本上没梳理过调用流程 趁着旧项目要使用QML技术 xff0c 现在就将C 43 43 和QML交互进行总结 目录 一
  • QT下TCP协议实现数据网络传输

    QT开发框架以其跨平台的优势 xff0c 在全世界IT界如雷贯耳 其封装了功能齐全的各种类 xff0c 大大的提高了开发者的效率 本篇内容将介绍如何使用QT 6 4 1框架开发服务器和客户端程序 xff0c 让两端能够首发消息 xff0c
  • 从零实现vins-mono+fast-planner+M100无人机实验在现实场景中的应用

    版权声明 本文为博主原创文章 未经博主允许不能随意转载 本文链接 https blog csdn net AnChenliang 1002 article details 109535355 最近由于科研的需要 要将VINS mono与fa

随机推荐

  • Linux下C语言实现HTTP文件服务器和TCP协议实现网络数据传输

    在实际开发中经常用到web框架 xff0c 比如Servlet xff0c SpringBoot等 xff0c 这些开发框架提高了我们的开发效率 xff0c 节省了开发时间 但是这会令我们技术人员处于浮云之上 xff0c 看不到其本质 说实
  • Linux下C语言UDP协议通信实践

    UDP和TCP协议一样 xff0c 都是传输层协议 是无连接的 xff0c 不安全的 xff0c 报式传输层协议 xff0c 通信过程默认也是阻塞的 其通信特点主要如下 xff1a xff08 1 xff09 不需要建立连接 xff0c 所
  • Ubuntu下PyQt5使用总结

    因为工作中需要给交付团队开发桌面工具 xff0c 考虑到交付团队多使用Mac xff0c 调研了一下发现PyQt5可以实现跨平台 xff0c 满足工具开发需要 xff0c 就用其开发了桌面工具 现以ubuntu开发环境为例总结一下开发过程
  • ubuntu下安装配置grpc

    目录 1 准备环境 2 安装protobuf 3 安装cares库 3 安装grpc 1 17 x 1 准备环境 sudo apt get install pkg config sudo apt get install autoconf a
  • cmake管理子程序,lib库和so库应用实践

    cmake在管理大型项目时经常被用到 xff0c 本文以简单程序演示来说明camke管理项目应用 xff0c 其中包括主程序 xff0c 子程序 xff0c so库程序 xff0c lib程序 目录 1 程序目录结构 2 编译执行 3 清除
  • GIt常用命令总结

    目录 1 创建新建分支 2 强制拉去代码 3 合并相邻提交 xff0c 保证只有一个commit信息 4 本地回退 5 查看git修改列表 6 提交代码 7 切换新分支并从服务端拉取最新 8 git cherry pick合并代码使用 9
  • Linux 下I/O多路复用总结

    xfeff xfeff select xff0c poll xff0c epoll都是IO多路复用的机制 I O多路复用就通过一种机制 xff0c 可以监视多个描述符 xff0c 一旦某个描述符就绪 xff08 一般是读就绪或者写就绪 xf
  • WAV文件头分析

    WAV语音文件头部含有44字节的标志信息 xff0c 其含义如下 xff1a ckid xff1a 4字节 RIFF 标志 xff0c 大写 wavHeader 0 61 39 R 39 wavHeader 1 61 39 I 39 wav
  • Linux环境下限制网速和取消限制网速

    查看网卡信息 ip addr root 64 rabbitmq01 ip addr 1 lo lt LOOPBACK UP LOWER UP gt mtu 65536 qdisc noqueue state UNKNOWN qlen 1 l
  • Linux 网络编程2 TCP并发服务器

    Linux 网络编程学习 TCP IP网络编程2 TCP多线程服务器TCP多进程服务器 在前面TCP网络编程代码的基础上进行改造 xff0c 实现并发服务器功能 TCP多线程服务器 实现功能 xff1a server端可以绑定在任意IP端s
  • HTTP Digest authentication

    什么是摘要认证 摘要认证 xff08 Digest authentication xff09 是一个简单的认证机制 xff0c 最初是为HTTP协议开发的 xff0c 因而也常叫做HTTP摘要 xff0c 在RFC2617中描述 其身份验证
  • 简单的netfilter hook函数注册以及内核链表的使用

    include lt linux netfilter h gt include lt linux init h gt include lt linux module h gt include lt linux netfilter ipv4
  • 详述GPS原理及RTK技术应用

    完整的PPT文档在这里 xff1a 详述GPS原理及RTK技术应用 1 GPS概述 1 1定义 全球定位系统GPS xff08 Global Position System xff09 xff0c 全称为NAVSTAR GPS xff08
  • PHP HTTP Digest校验

    PHP作为客户端进行HTTP Digest校验 span class token comment 请求方法 span span class token variable username span span class token oper
  • Http Digest认证协议

    其认证的基本框架为挑战认证的结构 xff0c 如下图所示 xff1a xfeff xfeff 1 客户端希望取到服务器上的某个资源 xff0c 向服务器发送Get请求 2 服务器收到客户端的请求后 xff0c 发现这个资源需要认证信息 xf
  • Postman 安装

    Postman 的下载安装 Postman是一个用于构建和使用API的API平台 xff08 接口的调试工具 xff09 选择对应的系统和版本进行下载 https github com hlmd Postman cn 这里我的电脑是wind
  • 【安卓自定义控件系列】自绘控件打造界面超炫功能超强的圆形进度条

    在前面我们讲过了安卓自定义控件三种方式中的组合控件 xff0c 现在我们来讲解一下通过自绘的方式来实现自定义控件 xff0c 本博客将以自定义圆形进度条为例向大家讲解自定义控件的知识 xff0c 首先来看一下效果图吧 xff0c 这个是本人
  • Linux网络编程3——多进/线程并发服务器

    视频链接 黑马程序员 Linux网络编程 哔哩哔哩 bilibili https www bilibili com video BV1iJ411S7UA p 61 37 目录 一 高并发服务器 1 1 图示 1 2 分类 二 多进程并发服务
  • http请求头和响应头

    文章目录 参考HTTP通用标头Cache ControlConnectionDatePragmaTrailerTransfer EncodingUpgradeViaWarning 请求头AcceptAccept RangesAccept E
  • C++如何使用libcurl发送post请求的三种content-type的封装

    作者 xff1a 虚坏叔叔 博客 xff1a https xuhss com 早餐店不会开到晚上 xff0c 想吃的人早就来了 xff01 x1f604 C 43 43 如何使用libcurl发送post请求的三种content type的