c++实现web服务器数据收发

利用微软标准API实现web服务器数据的发送和接受,遇到的问题点:
1.句柄创建
CString strMsg;
int iError = 0;
HINTERNET hint;
HINTERNET hftp;
HINTERNET hconnect;
HINTERNET Openhconnect;
hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY/INTERNET_OPEN_TYPE_PRECONFIG/, 0, 0, 0);
2.建立连接,获得连接句柄
hconnect = InternetConnect(hint, m_strFTPIP, m_iFTPPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if(hconnect==NULL)
{
iError = GetLastError();
InternetCloseHandle(hint);
AfxMessageBox(_T(“连接失败”));
return;
}
3.创建查询句柄,使用POST方式,这里需要注意,m_strURL这个地址,不是完整的地址,而是IP,端口之后的内容,以/开头的内容,而且必须带"/“.例如
http://10.192.10.123:500/api/testMark,那么这里的strURL就是”/api/testMark"
LPCTSTR szAccept[] = {_T(“/”), NULL};
DWORD dwFlags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE;
Openhconnect= HttpOpenRequest(hconnect,L"POST",m_strUrl, HTTP_VERSION/_T(“HTTP/1.1”)/,NULL,szAccept,dwFlags/INTERNET_FLAG_SECURE/,0);
iError=GetLastError();
4.设置http解析的header信息,主要包括字符集,主机,源地址,和Referer,这里需要注意,win10系统,只需要前两项就可以正常访问,win7系统需要全部设置,否者查询状态时候一直返回400或404错误代码,主要就是解析header出了问题,找不到解析数据,因此返回404.
//win10 只需要前两个header设置就可以了
TCHAR headerLanguage[] = _T(“Accept: application/json”);
TCHAR headerCharset[] = _T(“Accept-Charset: utf-8”);
//win7系统需要加上下面三个header
TCHAR headerHost[] = _T(“Host: 10.16.11.11:5003”😉;
TCHAR headerOrigin[] = _T(“Origin: http://10.16.11.61:5003”😉;
TCHAR headerReferer[] = _T(“Referer: http://10.16.11.11:5003/api/testMark”);

		ret=  HttpAddRequestHeaders(Openhconnect,headerLanguage, -1,HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);


			ret=  HttpAddRequestHeaders(Openhconnect,m_strHead,m_strHead.GetLength(),HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);


			ret=  HttpAddRequestHeaders(Openhconnect,headerCharset, -1,HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);

			ret = HttpAddRequestHeaders(Openhconnect, headerHost, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
			ret = HttpAddRequestHeaders(Openhconnect, headerOrigin, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   
			ret = HttpAddRequestHeaders(Openhconnect, headerReferer, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);   

5.发送接口函数内容,格式按照接口函数给的数据就好了有json数据,xml数据,文本数据,可以根据需要自行设置,这里需要转换一下,否者会发送失败.返回12029原因是IE没有设置TLS1.0,TLS1.1,TLS1.2,TLS1.3,有的美颜装IE,也需要安装下,全部勾选就好了,设置方法:控制面板—Internet选项—高级属性—安全选项卡----找到TLS1.0,TLS1.1,TLS1.2,TLS1.3,全部勾选
char utf8PostData[128] = {0};
USES_CONVERSION;
const char* pC = T2A(strCmd);//注意PC指向区域在栈空间
strcpy(utf8PostData, pC);
ret= HttpSendRequest(Openhconnect,0,0,utf8PostData,strlen(utf8PostData));
iError=GetLastError();
6.读取web服务器返回状态码
TCHAR szBuff[1024] = {0};
DWORD dwBuffSize = 1024;
BOOL bRet;
bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_STATUS_CODE, (LPVOID)szBuff, &dwBuffSize, NULL);
iError = ::GetLastError();//返回0
继续查询其他信息可以激活查询获取,然后读取数据即可:
if (bRet)
{
TCHAR szBuff[1024+1] = {0};
DWORD dwBuffSize = 1024*sizeof(szBuff);
bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_CONTENT_LENGTH, (LPVOID)szBuff, &dwBuffSize, NULL);

				memset(szBuff, 0, sizeof(szBuff));   
				dwBuffSize = 1024*sizeof(szBuff);   
				bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_DATE, (LPVOID)szBuff, &dwBuffSize, NULL);   

				memset(szBuff, 0, sizeof(szBuff));   
				dwBuffSize = 1024*sizeof(szBuff);   
				bRet = ::HttpQueryInfo(Openhconnect, HTTP_QUERY_SERVER, (LPVOID)szBuff, &dwBuffSize, NULL);   

				memset(szBuff, 0, sizeof(szBuff));   
				dwBuffSize = 1024*sizeof(szBuff);   
				bRet = ::InternetReadFile(Openhconnect, szBuff, dwBuffSize, &dwBuffSize);   
			
		} 

这样我们就可以和web服务器完成POST方式数据上传以及查询返回结果,如果需要继续解析数据,可以读取数据分析.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/751435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue的学习--day2

如有错误,烦请指正~ 目录 一、什么是单页面应用程序 二、使用工具:node.js 三、工具链 易错点 一、什么是单页面应用程序 多个组件(例如登录、注册等以vue结尾的都叫做组件)在一个页面显示,叫单页面应用…

Linux C 程序 【02】创建线程

1.开发背景 上一个篇章,基于 RK3568 平台的基础上,运行了最简单的程序,然而我们使用了 Linux 系统,系统自带的多线程特性还是比较重要的,这个篇章主要描述线程的创建。 2.开发需求 设计实验: 创建一个线程…

极验行为式验证码适配HarmonyOS 鸿蒙SDK下载

现阶段,越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与,早在去年9月,极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率,方便大家…

Android 通知组

一. 通知组简介 从 Android 7.0(API 级别 24)开始,您可以在一个组中显示相关通知。如下所示: 图 1. 收起(顶部)和展开(底部)的通知组。 注意 :如果应用发出 4 条或更多条通知且未…

大数据平台需要存算分离吗?某保险集团:以 ZBS 优化资源利用率,缩短业务用时超一半

金融机构普遍采用“存算一体”架构支撑基于 Hadoop 框架的大数据平台。而随着金融业务的多元化发展,不同业务对计算和存储的需求差异较大,由于“存算一体”架构共享存储与计算资源,经常会出现资源需求不均衡、资源利用率低下、难以灵活调度等…

工具篇:鸿蒙DevEco Studio5.0版本下载及安装

1、下载中心地址 下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态 2、安装 DevEco Studio支持Windows和macOS系统,下面将针对两种操作系统的软件安装方式分别进行介绍。 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#…

Mysql需要知道的点

目录 一、数据库的三范式是什么 二、Mysql数据库引擎有哪些 三、说说Innodb与MYISAM的区别 四、数据库的事务 五、索引是什么 六、优化手段有哪些 七、简单说一说 drop,delete与truncate的区别 八、什么是视图 九、什么是内连接、左外连接、右外连接&#x…

Ubuntu20.04使用Samba

目录 一、Samba介绍 Samba 的主要功能 二、启动samba 三、主机操作 四、Ubuntu与windows系统中文件互联 五、修改samba路径 一、Samba介绍 Samba 是一个开源软件套件,用于在 Linux 和 Unix 系统上实现 SMB(Server Message Block)协议…

[行业原型] Web端原型案例:康欣医疗后台管理系统

​医疗管理系统是一个业务复杂,功能庞大的系统,以下为HIS医院管理系统的常见模块,供大家参考。 本周为大家带来Web端原型案例:康欣医疗后台管理系统,先上原型: 完整文档加班主任微信号 添加班主任回复 “1…

ansible常用模块详解

一、Ansible 1.1 简介 Ansible是自动化运维工具,能实现跨主机对应用编排管理部署。 Ansible能批量配置、部署、管理上千台主机,是应用级别的跨主机编排工具。 比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一…

练习实践:ubuntu18.04安装、配置Nginx+PHP环境,两种配置方式,多站点

参考来源: https://help.aliyun.com/document_detail/464753.html https://www.cnblogs.com/laosan007/p/12803287.html https://blog.csdn.net/qq_55364077/article/details/132207083 【安装同版本7.2的php】 需要知道对应php和nginx的安装版本 需要安装php-fpm…

stl之string

构造函数 void test1() {string s1;//不传参cout << s1 << endl;string s2("123456");cout << s2 << endl;string s3(s2);cout << s3 << endl;string s4(s2, 1, 5);cout << s4 << endl;string s5("123456&quo…

PHP 网络通信底层原理分析

大家好&#xff0c;我是码农先森。 引言 我们日常的程序开发大多数都是以业务为主&#xff0c;很少会接触到底层逻辑。对于我们程序员来说&#xff0c;了解程序的底层运行逻辑&#xff0c;更有助于提升我们对程序的理解。我相信大多数的人&#xff0c;每天基本上都是完成业务…

丝杆支撑座:滚珠丝杆稳定运行的守护者!

丝杆支撑座是丝杆和电机之间连接的重要组成部分&#xff0c;发挥着非常重要的功能。提到丝杆支撑座和滚珠丝杆&#xff0c;很多人都会想到支撑关系&#xff0c;但丝杆支撑座作为滚珠丝杆系统中至关重要的角色&#xff0c;其作用远不止于简单的支撑。 丝杆支撑座安装过程非常简单…

第30课 绘制原理图——放置网络标签

什么是网络标签&#xff1f; 我们在很多电路图中都能看到&#xff0c;为了让图纸更加简洁&#xff0c;并不是每一根导线都要确确实实地画出来。可以在导线悬空的一端添加一个名称标签&#xff0c;接着在另一根导线的悬空一端添加上一个同名的名称标签&#xff0c;那么就可以让…

【自监督-MIM】系列方法学习二

Masked image modeling 是一种训练深度学习模型的技术,尤其是在视觉领域,类似于自然语言处理中的掩码语言建模(Masked Language Modeling)。它通过在输入图像中随机遮挡(或称为掩码)部分区域,然后训练模型来预测这些被遮挡部分的内容,从而提高模型的视觉理解能力。 Ma…

IDEA无法输入中文,怎么破

1.导航栏处&#xff0c;点击help菜单&#xff0c;选择Edit Custom VM Options.. 2.编辑文件&#xff0c;在文件末尾添加&#xff1a; -Drecreate.x11.input.methodtrue 3.保存文件即可&#xff0c;如果还是不行&#xff0c;就关闭所有Idea程序&#xff0c;重新启动Idea

机器学习之集成学习

一&#xff1a;概念 顾名思义集成学习就是用多个其他的算法结合起来使用 对于“其他算法”有同类和同质的区别&#xff0c;同质指的是所用的算法都是同一类型的&#xff0c;比如决策树和神经网络&#xff0c;这种也叫基学习器。反之亦然&#xff0c;但一般使用的是同质的。 …

网络治理新模式:Web3时代的社会价值重构

随着Web3技术的崛起&#xff0c;传统的网络治理模式正在经历革新&#xff0c;这不仅仅是技术的进步&#xff0c;更是对社会价值观念的挑战和重构。本文将深入探讨Web3时代的网络治理新模式&#xff0c;其背后的技术基础、社会影响以及未来的发展方向。 1. 引言 Web3时代&#…

文件进行周期性备份后权限更改的解决方案--使用脚本和定时任务

这里写目录标题 背景现象解决方案原因分析面临的问题解决思路操作步骤每个文件夹权限分配表测试chmod和chown两个命令是否可行写脚本实现定时同步同时修改权限 异地同步改权限在NAS上生成SSH密钥对将NAS的公钥复制到Linux服务器在NAS上编写同步脚本在NAS上执行脚本&#xff0c;…