C++, 简单 http 下的 POST 和 Get

#pragma once
#include <Windows.h>
#include <winsock.h>
#include <sstream>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")



class WinHttp
{
public:
	WinHttp()
	{
		//此处一定要初始化一下,否则gethostbyname返回一直为空;
		WSADATA wsa = { 0 };
		if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
		{
			std::cout << "init WSADATA failed!" << std::endl;
		}
	}

	~WinHttp(){}

public:
	void PostData(std::string host, int port, std::string path, std::string post_content)
	{
		//POST请求方式;
		std::stringstream stream;
		stream << "POST " << path;
		stream << " HTTP/1.0\r\n";
		stream << "Host: " << host << "\r\n";
		stream << "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n";
		//stream << "Content-Type:application/x-www-form-urlencoded\r\n";
		stream << "Content-Type:application/json\r\n";
		stream << "Content-Length:" << post_content.length() << "\r\n";
		stream << "Connection:close\r\n\r\n";
		stream << post_content.c_str();

		Http(host, port, stream.str());
	}

	void GetData(std::string host, int port, std::string path, std::string get_content)
	{
		//GET请求方式;
		std::stringstream stream;
		stream << "GET " << path << "?" << get_content;
		stream << " HTTP/1.0\r\n";
		stream << "Host: " << host << "\r\n";
		stream << "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3\r\n";
		stream << "Connection:close\r\n\r\n";

		Http(host, port, stream.str());
	}

private:
	void Http(std::string host, int port, std::string request)
	{
		int sockfd;
		struct sockaddr_in address;
		sockfd = socket(AF_INET, SOCK_STREAM, 0);
		address.sin_family = AF_INET;
		address.sin_port = htons(port);
		address.sin_addr.S_un.S_addr = inet_addr(host.c_str()); //直接填写地址;
		/*
		struct hostent *server = gethostbyaddr(host.c_str(), host.size(), AF_INET);
		//struct hostent *server = gethostbyname(host.c_str());
		if (!server)
		{
			switch (h_errno)
			{
			case HOST_NOT_FOUND:
				fputs("The host was not found.\n", stderr);
				break;
			case NO_ADDRESS:
				fputs("The name is valid but it has no address.\n", stderr);
				break;
			case NO_RECOVERY:
				fputs("A non-recoverable name server error occurred.\n", stderr);
				break;
			case TRY_AGAIN:
				fputs("The name server is temporarily unavailable.", stderr);
				break;
			default:
				break;
			}
			std::cout << "gethostbyaddr(...) failed!" << std::endl;
			return;
		}
		memcpy((char *)&address.sin_addr.s_addr, (char*)server->h_addr, server->h_length);
		*/
		if (-1 == connect(sockfd, (sockaddr *)&address, sizeof(address)))
		{
			std::cout << host << ":" << port << " connection failed!" << std::endl;
			return;
		}

		//std::cout << request << std::endl;

		send(sockfd, request.c_str(), request.size(), 0);
		char buf[1024 * 2] = { 0 }; //不能设置过大,否则会栈溢出,如果必须设置较大,用堆new;
		//char *buf = new char(1024 * 1024);
		int offset = 0;
		int rc;

		while (rc = recv(sockfd, buf + offset, 1024, 0))
		{
			offset += rc;
		}

		buf[offset] = 0; //最后结束符;

		closesocket(sockfd); //断开;

		std::cout << "recv: " << buf << std::endl;

		//delete[] buf;
	}

	inline char* UnicodeToUtf8(const wchar_t* unicode)
	{ // Unicode 转 UTF-8
		int len;
		len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
		char *szUtf8 = (char*)malloc(len + 1);
		memset(szUtf8, 0, len + 1);
		WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
		return szUtf8;
	}
};

使用方法如下:


WinHttp *http = new WinHttp();
http->getData("127.0.0.1", 8080, "/login", "id=admin&pw=123");
http->postData("127.0.0.1", 8080, "/login","id=admin&pw=123");

当然,前题要有Web后台; 

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

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

相关文章

零代码编程:用Kimichat从PDF文件中批量提取图片

一个PDF文件中&#xff0c;有很多图片&#xff0c;想批量提取出来&#xff0c;可以借助kimi智能助手。 在借助kimi智能助手中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个网页爬取Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹…

【LeetCode刷题】410. 分割数组的最大值

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 410. 分割数组的最大值 2. 题目描述 3. 解题方法 题目中提到的是某个和的最大值是最小的&#xff0c;这种题目是可以用二分来解决的。 确定区间&#xff0c;根据题目的数据范围&#xff0c;可以确定区间就是[0, 1e9]…

【云原生】Docker 实践(五):搭建私有镜像 Harbor

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

uniapp 应用闪退、崩溃异常日志捕获插件(可对接网络上报)插件 Ba-Crash

应用闪退、崩溃异常日志捕获插件&#xff08;可对接网络上报&#xff09; Ba-Crash 简介&#xff08;下载地址&#xff09; Ba-Crash 是一款uniapp应用闪退、崩溃异常日志捕获插件&#xff0c;支持对接网络上报、设置提示等等&#xff0c;方便对一些远程问题、原生问题进行分…

C# dateTimePicker控件存取数据库问题

存入数据库时&#xff0c;先设置&#xff0c; dateTimePicker1.Format DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat "yyyy-MM-dd HH:mm:ss"; 然后&#xff0c;dateTimePicker1.Text 就和textBox1.Text一样方式存入数据库&#xff1b;…

CMake:静态库链接其他动态库或静态库(九)

1、项目结构 对于下面这样一个项目 把calc模块做成静态或者动态库把sort模块做成静态库然后再sort模块中的*.cpp调用calc模块生成的库即可&#xff08;这样就制作了一个静态库引用动态或者静态库&#xff09;test模块用于测试sort模块中的内容 . ├── calc │ ├── ad…

《Mask2Former》算法详解

文章地址&#xff1a;《Masked-attention Mask Transformer for Universal Image Segmentation》 代码地址&#xff1a;https://github.com/facebookresearch/Mask2Former 文章为发表在CVPR2022的一篇文章。从名字可以看出文章像提出一个可以统一处理各种分割任务&#xff08;…

参考文献的力量:正确引用,提升论文质量

引用你的资料来源可能看起来是写作过程中一个乏味的步骤。通常更容易将任务推迟到最后一刻&#xff0c;结果却发现自己在最后制定了一份写得不好的引文列表。使用这些有用的引用说明将您的研究提升到另一个水平&#xff0c;从而省去麻烦。 引用参考文献的建议 引用来源的方法有…

C语言指针进阶_字符指针、指针数组、数组指针、函数指针等的介绍

文章目录 前言一、字符指针二、指针数组三、 数组指针1. 数组名和 & 数组名2. 数组指针3. 数组指针解引用 四、数组指针的使用二维数组的传参说明数组指针使用小测验 五、数组传参和指针传参1. 一维数组传参总结2. 二维数组传参总结3. 一级指针传参4. 二级指针传参 六、函数…

【牛客网】排列计算

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 如果直接涂色来计算单点权重&#xff0c;2e5*2e5必然超时。 所以用差分进行优化。 3. 代码实现 #include<bits/stdc.h> using name…

汇报进度26届cpp,目前来说之后的规划,暑假打算回家10天就留校沉淀了

汇报一下进度吧&#xff0c;26双非菜鸡&#xff0c;cpper. 但目前学了一些go &#xff0c;辅修吧&#xff0c;距离发的上个动态已经过去3个月了&#xff0c;真的觉得找实习时间来不及&#xff0c;现在leetcode 100多道题&#xff0c;前几天蓝桥杯整了个省二&#xff0c;把OS和…

[C++基础学习]----04-一维数组和二维数组详解

前言 在C中&#xff0c;数组是一种用来存储相同类型元素的数据结构。一维数组是最简单的数组形式&#xff0c;它由一系列按顺序存储的元素组成。二维数组则是由一维数组构成的数组&#xff0c;可以看作是一堆一维数组堆叠在一起形成的矩阵。 正文 01-数组简介 一维数组和二维…

计算机毕业设计php自行车在线租赁管理系统-vue+mysql

本系统的开发使获取自行车在线租赁管理系统信息能够更加方便快捷&#xff0c;同时也使自行车在线租赁管理系统管理信息变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。 自行车在线租赁管理系统&#xff0c;主要的模块包括首页、个人中心、用户管理、会员管理、自…

Unity开发微信小游戏(2)分享

目录 1.概述 2.代码 3.示例 4.个人作品 1.概述 这里我们能做有两件事&#xff1a; 1&#xff09;主动发起分享 2&#xff09;监听右上角分享&#xff08;...按钮&#xff0c;发朋友圈也在这里&#xff09; API&#xff1a;官方文档 2.代码 1&#xff09;主动发起分享&…

RS0102YH8功能和参数介绍及如何计算热耗散

RS0102YH8功能和参数介绍-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 RS0102YH8 是一款电平转换芯片&#xff0c;由润石&#xff08;RUNIC&#xff09;公司生产。以下是关于RS0102YH8的一些功能和参数的介绍&#xff1a; 电平转换功能&#xff1a; RS0102YH8旨在提供电平转换…

ThinkPad X1 Carbon 2018 6th Gen(20KG,20KH)原装出厂Win10系统镜像下载,恢复开箱状态预装OEM系统

lenovo联想ThinkPad X1 6th Gen笔记本电脑(20KG,20KH)原厂Windows10系统重置安装包 链接&#xff1a;https://pan.baidu.com/s/1rrMch_XdYqKsDXOUSBm3WA?pwdwgxz 提取码&#xff1a;wgxz 联想原装W10系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属L…

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

【C++】学习笔记——vector_1

文章目录 七、vector1. vector的介绍2. vector的使用 未完待续 七、vector vector 1. vector的介绍 学了 string类 后&#xff0c;学习其他容器就非常简单了。 vector 是表示可变大小数组的序列容器。就是高配版数组。用法就是 vector< class T> name 。 2. vector的…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接&#xff0c;那么状态转移方程为&#xff1a; d p [ i ] t r u e &#xff0c;如果存在任意 j ∈ [ 0 , i − 1…

【CTF Reverse】XCTF GFSJ0489 open-source Writeup(C语言+代码审计+十六进制)

open-source 菜鸡学逆向学得头皮发麻&#xff0c;终于它拿到了一段源代码 解法 是一段 c 语言的源程序。 #include <stdio.h> #include <string.h>int main(int argc, char *argv[]) {if (argc ! 4) {printf("what?\n");exit(1);}unsigned int first…
最新文章