网络通信第五课 生产环境下的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;

时间: 2024-10-18 10:11:47

网络通信第五课 生产环境下的Post通信的相关文章

生产环境下ftp的迁移并构建高可用

说明:这是1个小项目就两台DELL的服务器,和一台IP SAN存储(DELL MD3200i).原来是4台小服务器,而且服务器太老了,经常有问题,这回相当于一次ftp的迁移,以前用的是proftp,这次换成了vsftp.数据量有2.5T. 拓扑很简单: 系统:CENTOS 6.4(64bit) 高可用软件:corosync+pacemaker host:ftp1 192.168.1.190 ftp2  192.168.1.191 stonith(ipmi):ftp1 192.168.1.180

生产环境下的iptables

生产环境下的iptables设置,这是我自己的一点总结,浅显之处望大家指出批评,共同学习. 我的局域网为192.168.1.0/24. 1.先清空所有规则 iptables -F iptables -X iptables -Z iptables -t nat -F iptables -t nat -X iptables -t nat -Z 设置默认规则前开发ssh(6123)端口 iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp --dport

读生产环境下go语言最佳实践有感

最近看了一篇关于go产品开发最佳实践的文章,go-in-procution.作者总结了他们在用go开发过程中的很多实际经验,我们很多其实也用到了,鉴于此,这里就简单的写写读后感,后续我也争取能将这篇文章翻译出来.后面我用soundcloud来指代原作者. 开发环境 在soundcloud,每个人使用一个独立的GOPATH,并且在GOPATH直接按照go规定的代码路径方式clone代码. $ mkdir -p $GOPATH/src/github.com/soundcloud $ cd $GOPA

生产环境下was不允许重启,怎么办?

前段时间上线,遇到一个jndi的故障问题,怎么个问题呢?就是原在测试环境下没有问题,而在生产环境下无法连接生产数据库,当时找到问题所在,就是ibm工具自动生成一个在测试环境下连接的jndi的资源文件resources.xml,当时删除了,重启了server,无效.后来我考虑到这肯定是was缓存造成,因此想象缓存造成的原因,最后在测试环境下重启了was,问题解决了,但后来说生产环境是不可能重启was的,因此暂时困老了本人,后来所谓的领导说,他去找总架构师看有没有办法解决,可是时间不等人,过了2天依

[原]生产环境下的nginx.conf配置文件(多虚拟主机)

[原]生产环境下的nginx.conf配置文件(多虚拟主机) 2013-12-27阅读110 评论0 我的生产环境下的nginx.conf配置文件,做了虚拟主机设置的,大家可以根据需求更改,下载即可在自己的机器上使用了,本配置文件摘录自<构建高可用Linux服务器>(机械工业出版社),转载麻烦注明出处,谢谢,配置文件如下: user  www www;worker_processes 8;error_log  /data/logs/nginx_error.log  crit;pid      

EF 第三篇 生产环境下的数据迁移

前言 本文所谓数据迁移,直白点不如说成数据库升级.虽然大部分带服务器型的应用,所有客户端都是连到同一台服务器上,对这样的生产环境,数据库升级起来不是什么难事,用vs自带的Migration也好,执行sql脚本也好,都比较容易.然而在每家客户现场都要部署一台服务器的应用也不少,如果一家家手工地去升级数据库,那将是一个可怕的工作量.那么对于这样的环境要怎么做到自动升级数据库呢?相信大家也在网上搜了不少了EF关于生产环境下的数据迁移方案,然后99%搜到的都是使用vs自带的Migration命令方式迁移

Windows 2008下 rman backup scirpts(备份脚本)--已经在生产环境下通过验证

一.任务计划 windows -控制面板-管理工具-计划任务程序,右击"任务计划程序库","创建任务" 二:相关脚本中的内容: 2.1  back_rman.bat中的内容: set ORACLE_SID=FS F:\oracle\product\10.2.0\db_1\BIN\rman target / cmdfile=H:\worksql\windows_backupscript\backup.rcv log=H:\worksql\windows_backups

生产环境下JAVA进程高CPU占用故障排查

问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过,排除此类情况.2,程序代码有问题,出现死循环,可能性极大. 问题解决:1,开发那边无法排查代码某个模块有问题,从日志上也无法分析得出.2,记得原来通过strace跟踪的方法解决了一台PHP服务器CPU占用高的问题,但是通过这种方法无效,经过google搜索,发现可以通过下面的方法进行解决,那就尝试下

生产环境下,oracle不同用户间的数据迁移。第三部分

任务名称:生产环境下schema ELON数据迁移至schema TIAN########################################前期准备:1:确认ELON用户下的对象状态select owner,constraint_name,constraint_type,table_name,status,validated from dba_constraints where owner='ELON'owner constraint_name constraint_type ta