栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++经验积累01

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++经验积累01

使用Socket实现Post通信

c++使用socket实现Post通信并获取返回信息

//post.h头文件
#pragma once
#include 
#include 
#include
using namespace std;   
class HttpRequest
{
	// Http POST请求
	std::string HttpPost(std::string url, std::string json, std::string methodName);
   private:
	std::string         m_ip;
	int             m_port;
};
//用到的头文件
#include"stdafx.h"
#include"pch.h"
#include "post.h"
#include 
#include 
#include
#include
using namespace std;
#pragma comment(lib, "ws2_32.lib")
// Http POST请求并发送json
std::string HttpRequest::HttpPost(std::string url, std::string json, std::string methodName)
{
	std::string ret; // 返回Http Response内容
	try
	{
		// 开始进行socket初始化;
		WSADATA wData;
		::WSAStartup(MAKEWORD(2, 0), &wData);//初始化socket环境
		SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);//初始化Socket实例
		struct sockaddr_in ServerAddr = { 0 };//初始化sockaddr_in服务实例
		ServerAddr.sin_addr.s_addr = inet_addr(m_ip.c_str());//设置sockaddr_in服务IP
		ServerAddr.sin_port = htons(m_port);//设置sockaddr_in服务端口
		ServerAddr.sin_family = AF_INET;//设置sockaddr_in服务类型
		int errNo = connect(clientSocket, (sockaddr*)&ServerAddr, sizeof(ServerAddr));//连接服务器

		if (clientSocket == INVALID_SOCKET) { return ""; }//判断socket是否有效

		DWORD TimeOut =500; //设置socket超时时长
		if (::setsockopt(clientSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) 
		{
			return "";
		}//判断socket发送设置是否存在错误

		TimeOut =500;
		if (::setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) 
		{
			return "";
		}//判断socket接收设置是否存在错误

		if (errNo == 0)//判断socket连接服务器是否成功0为成功其他为失败
		{
			std::string strLen = to_string(json.length() + 2);//获取json数据长度并添加2个回车换行符长度
			std::string sendStr;//http发送报文
			//进行发送报文拼接
			sendStr += "POST ";
			sendStr += methodName;
			sendStr += " HTTP/1.1rn";
			sendStr += "Connection: Keep-Alive rn";
			sendStr += "Accept-Encoding:gzip, deflate rn";
			sendStr += "Accept-Language:zh-CN,en,*rn";
			sendStr += "Content-Length:";
			sendStr += strLen;
			sendStr += "rn";
			sendStr += "Content-Type:application/json;charset=UTF-8 rn";
			sendStr += "Host:";
			sendStr += m_ip;
			sendStr += ":";
			sendStr += to_string(m_port);
			sendStr += "rn";
			sendStr += "Origin:";
			sendStr += url;
			sendStr += "rn";
			sendStr += "rnrn";
			sendStr += json;
			sendStr += "rnrn";

			// 发送
			errNo = send(clientSocket, sendStr.c_str(), (int)strlen(sendStr.c_str()), 0);
		    //获取发送字节数
			if (errNo > 0)//如果字节数大于0则表示发送成功
			{
				cout<<"发送成功n";
			}
			else
			{
				std::cout << "errNo:" << errNo << std::endl;
				ret = errNo;
				return ret;
			}

			// 接收
			char bufRecv[1024];//设置接收char数组

			bool isRun = true;//数据接收完毕标志
			//循环接收数据
			do
			{
				int r = recv(clientSocket, bufRecv, (1024), 0);//接收数据
				if (r > 0)//判断接收到的数据长度是否为0
				{
					ret.append(bufRecv);
					isRun = true;
				}
				else//如果接收长度为0则退出循环
				{
					isRun = false;
				}
			} while (isRun);
		if(!(sizeof(ret)>0))//如果接收的数据长度不大于0则表示没有连接上服务器
		{
			errNo = WSAGetLastError();
			ret = "Err:Connect Fail ErrCode->";
			ret += to_string(errNo);
		}
	
		}
		closesocket(clientSocket);//关闭socket
		WSACleanup();	// socket环境清理
	}
	catch (...)//捕获异常
	{
		return "";
	}
	return ret;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346869.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号