当前位置: 首页 > article >正文

【问题】C++ libcurl实现PUT时阻塞问题

解决方案

curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

换成

 curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");  

原因

在项目中对方要求使用PUT来发送控制指令,于是直接使用Libcurl来实现。原本是一个非常简单的事情,确怎么都没发送出控制指令,单步执行发现curl_easy_perform阻塞了,网上查了各种原因,发现都不适用,最后对比Postman发送数据,发现上述问题。最终实现代码如下:

size_t write_callback(void* contents, size_t size, size_t nmemb, void* userp) {
	// 处理响应数据  
	char* pData = (char*)contents;
	cout << "contents == " << pData << endl;
	return size * nmemb; // 返回接收到的字节数,以便libcurl知道数据已经被接收  
}
static bool initPutUpPlat(const char* url,  string strUser, string strPsd,  string& strRes)
{
	string strke = strUser + ":" + strPsd;
	curl_global_init(CURL_GLOBAL_ALL);
	CURLcode code;
	CURL* conn;
	conn = curl_easy_init();
	if (NULL == conn)
	{
		std::cout << stderr << " Failed to create CURL connection" << std::endl;
		exit(EXIT_FAILURE);
	}
	code = curl_easy_setopt(conn, CURLOPT_URL, url);
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	code = curl_easy_setopt(conn, CURLOPT_USERPWD, strke.c_str());
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	code = curl_easy_setopt(conn, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	code = curl_easy_setopt(conn, CURLOPT_CUSTOMREQUEST, "PUT");
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	struct curl_slist* headers = NULL;
	headers = curl_slist_append(headers, "Content-Type: text/plain");
	code = curl_easy_setopt(conn, CURLOPT_HTTPHEADER, headers);
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	const char* data = "指令....";
	code = curl_easy_setopt(conn, CURLOPT_POSTFIELDS, data);
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, write_callback); // 设置回调函数以处理上传的数据
	if (code != CURLE_OK)
	{
		std::cout << stderr << " Failed to set error buffer " << code << std::endl;
		return false;
	}
	code = curl_easy_perform(conn);
	if (code != CURLE_OK)
	{
		return false;
	}
	curl_slist_free_all(headers);//记得释放
	return true;
}

为何阻塞

注意:如果使用CURLOPT_PUT一定要记得添加传输大小CURLOPT_INFILESIZE_LARGE

 通过put上传文件
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
curl_easy_setopt(curl, CURLOPT_READDATA, fp);   // FILE *fp = fopen("/path/filename");
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, fsize);  // fsize = sizeof /path/filename

http://www.kler.cn/a/157665.html

相关文章:

  • 公有云迁移研究——AWS Route53
  • Windows使用Redis
  • MySQL表的查询、更新、删除
  • 手搭手浅学状态管理VueX
  • 代码随想录-刷题第十七天
  • spark3.x 读取hudi报错
  • 【总结】考研数学中函数的对称性(f(a+x)=f(a-x))【轴对称和中心对称】
  • 统计学基础至1-3
  • STM32CubeMx+MATLAB Simulink点灯程序
  • Common.js 和 ES6 Module 中模块引入的区别
  • 音视频技术开发周刊 | 322
  • jenkins-cicd基础操作
  • Python核心编程之认识python中的数字
  • redis 安装在liunx安装和常用文件配置
  • VSCode 配置JavaScript环境
  • Rust 枚举和模式匹配
  • 数据管理系统-week11-用户管理
  • 游戏的UI管理的完整机制总结及框架展示
  • AI Agent 结构与分类
  • 前端面试八股文(详细版)— 下