网络通信第五课 生产环境下的Post通信

简介:

说明

封装成一个完整的C++类,对于异常的校验和处理有待在实际的过程中,进一步加强,

目前对于套接字的关闭,释放网络资源应该是没有问题的


#include <iostream>

#include <fstream>

#include <string>

#include <boost/asio.hpp>


using namespace std;

using namespace boost::asio;


class CHttpPost;


unsigned char ToHex(unsigned char x)

{

return  x > 9 ? x + 55 : x + 48;

}


unsigned char FromHex(unsigned char x)

{

unsigned char y;

if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;

else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;

else if (x >= '0' && x <= '9') y = x - '0';

else assert(0);

return y;

}


std::string UrlEncode(const std::string& str)

{

std::string strTemp = "";

size_t length = str.length();

for (size_t i = 0; i < length; i++)

{

if (isalnum((unsigned char)str[i]) ||

(str[i] == '-') ||

(str[i] == '_') ||

(str[i] == '.') ||

(str[i] == '~') ||

(str[i] == '&') ||

(str[i] == '='))

strTemp += str[i];

else if (str[i] == ' ')

strTemp += "+";

else

{

strTemp += '%';

strTemp += ToHex((unsigned char)str[i] >> 4);

strTemp += ToHex((unsigned char)str[i] % 16);

}

}

return strTemp;

}


std::string UrlDecode(const std::string& str)

{

std::string strTemp = "";

size_t length = str.length();

for (size_t i = 0; i < length; i++)

{

if (str[i] == '+') strTemp += ' ';

else if (str[i] == '%')

{

assert(i + 2 < length);

unsigned char high = FromHex((unsigned char)str[++i]);

unsigned char low = FromHex((unsigned char)str[++i]);

strTemp += high * 16 + low;

}

else strTemp += str[i];

}

return strTemp;

}


class CHttpPost

{

public:

CHttpPost(std::string strServerIP, int sServerPort)

{

m_sServerPort = sServerPort;

m_strServerIP = strServerIP;

}


int SendPostRequest(std::string strUrl, std::string strPostData, char* pszRecvData)

{

std::string strUrlEnCodedBuffer = UrlEncode(strPostData);


io_service iosev;

ip::tcp::socket socket(iosev);

ip::tcp::endpoint ep(ip::address_v4::from_string(m_strServerIP), m_sServerPort);

boost::system::error_code ec;

do

{

socket.connect(ep, ec);

if (ec) break;


boost::asio::streambuf request;

std::ostream request_stream(&request);


request_stream << "POST " << strUrl << " HTTP/1.1\r\n";

request_stream << "Host: " << m_strServerIP << ":" << m_sServerPort << "\r\n";

request_stream << "Content-Length: " << strUrlEnCodedBuffer.size() << "\r\n";

request_stream << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";

request_stream << "\r\n";

request_stream << strUrlEnCodedBuffer;


size_t len = boost::asio::write(socket, request, ec);

if (ec) break;


char szRecvBuf[1024] = { 0 };

int nReadLen = socket.read_some(buffer(szRecvBuf), ec);

std::cout << "Http Response Context:" << std::endl;

std::cout << szRecvBuf << std::endl;

if (ec) break;


strcpy_s(pszRecvData, nReadLen+1, szRecvBuf);

std::string strRecvBuf = szRecvBuf;

int nIndexOfBody = strRecvBuf.find("\r\n\r\n", 0);

if (nIndexOfBody < 0) return -1;


std::string strHttpBody = strRecvBuf.substr(nIndexOfBody + 4);

std::cout << "Http Body Context:" << std::endl;

std::cout << strHttpBody << std::endl;

} while (0);


socket.close();

if (ec) return -1;


return 0;

}


private:


int m_sServerPort;

std::string m_strServerIP;

};


测试代码


  char szSrcBuffer[1024] = { "authorJson={loginAccount:\"admin\"}&parmJson={code:\"SheBeiLiXianGaoJingShangChuan\",params:{id:\"3919123496\",remarks:\"fire alarm\",time_alarm:\"2017-1-1\",alarm_source:\"192.168.1.11\"}}" };

char szUrl[256] = { "/cs/restfull/operationRestfullApi/excuteSqlByCode" };

CHttpPost instance("120.77.55.115", 8089);

char szRecvData[1024] = { 0 };

instance.SendPostRequest(szUrl, szSrcBuffer, szRecvData);

return 0;







     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1956098,如需转载请自行联系原作者
相关文章
|
1天前
|
canal 编解码 运维
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
飞天洛神云网络再度入选通信顶会 SIGCOMM'24
26 12
|
5月前
|
网络协议 安全 5G
网络与通信原理
【10月更文挑战第14天】网络与通信原理涉及众多方面的知识,从信号处理到网络协议,从有线通信到无线通信,从差错控制到通信安全等。深入理解这些原理对于设计、构建和维护各种通信系统至关重要。随着技术的不断发展,网络与通信原理也在不断演进和完善,为我们的生活和工作带来了更多的便利和创新。
116 3
|
8天前
|
人工智能 自然语言处理 决策智能
智能体竟能自行组建通信网络,还能自创协议提升通信效率
《一种适用于大型语言模型网络的可扩展通信协议》提出创新协议Agora,解决多智能体系统中的“通信三难困境”,即异构性、通用性和成本问题。Agora通过标准协议、结构化数据和自然语言三种通信格式,实现高效协作,支持复杂任务自动化。演示场景显示其在预订服务和天气预报等应用中的优越性能。论文地址:https://arxiv.org/pdf/2410.11905。
24 6
|
2天前
|
缓存 网络协议 安全
即时通讯初学者必知必会的20个网络编程和通信安全知识点
即时通讯IM应用开发的初学者很容易迷失在网络编程的复杂性以及通信安全的各种概念里,本文不涉及深度理论知识,尽量通过一句话或几句话让你快速了解20个相关的网络编程和通信安全知识点,希望能助你愉快地开始即时通讯应用开发。
15 0
|
3月前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
83 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
4月前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
101 11
|
4月前
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
49 3
|
4月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
82 1
|
4月前
|
传感器 自动驾驶 物联网
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
124 4
|
5月前
|
机器学习/深度学习 人工智能 算法

热门文章

最新文章