古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。这篇文章主要讲述安卓其他Windows下的C++网络请求相关的知识,希望能为你提供帮助。
工作使用了C++在Window系统上接入一个硬件平台的通信库,只能使用C++去调用他们给的dll函数,而且通信后还要把数据上报到后台服务器,所以整理了一下C++在Windows系统下网络请求方法。
第一部分 : 知识点
用到的C++基础知识点
1.C++相关
- 类定义
- 函数定义
- 构造函数与析构函数
- #ifdef宏的使用
- http报文头
- GET与POST的报文格式区别
第二部分 : 代码
贴上C++实现的网络请求代码,其实本质就是利用Socket发生Http格式报文。
1.功能声明
- HttpConnect.h
class HttpConnect { public: void socketHttp(std::string host, std::string request); void postData(std::string host, std::string path, std::string post_content); void getData(std::string host, std::string path, std::string get_content); HttpConnect(); ~HttpConnect(); };
- HttpConnect.cpp
#ifdef WIN32 #pragma comment(lib,"ws2_32.lib") #endif #include #include #include #include "HttpConnect.h"HttpConnect::HttpConnect() { #ifdef WIN32 // 此处一定要初始化一下,否则gethostbyname返回一直为空 WSADATA wsa = { 0 }; WSAStartup(MAKEWORD(2, 2), & wsa); #endif }HttpConnect::~HttpConnect() {} void HttpConnect::socketHttp(std::string host, std::string request) { int sockfd; struct sockaddr_in address; struct hostent *server; sockfd = socket(AF_INET,SOCK_STREAM,0); address.sin_family = AF_INET; address.sin_port = htons(8091); server = gethostbyname(host.c_str()); memcpy((char *)& address.sin_addr.s_addr,(char*)server-> h_addr, server-> h_length); if(-1 == connect(sockfd,(struct sockaddr *)& address,sizeof(address))){ std::cout < < "connection error!"< < std::endl; return; }std::cout < < request < < std::endl; #ifdef WIN32 send(sockfd, request.c_str(),request.size(),0); #else write(sockfd,request.c_str(),request.size()); #endif char buf[1024*1024] = {0}; int offset = 0; int rc; #ifdef WIN32 while(rc = recv(sockfd, buf+offset, 1024,0)) #else while(rc = read(sockfd, buf+offset, 1024)) #endif { offset += rc; }#ifdef WIN32 closesocket(sockfd); #else close(sockfd); #endif buf[offset] = 0; std::cout < < buf < < std::endl; }void HttpConnect::postData(std::string host, std::string path, std::string post_content) { // POST请求方式 std::stringstream stream; stream < < "POST " < < path; stream < < " HTTP/1.0"; stream < < "Host: "< < host < < ""; 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"; stream < < "Content-Type:application/x-www-form-urlencoded"; stream < < "Content-Length:" < < post_content.length()< < ""; stream < < "Connection:close"; stream < < post_content.c_str(); socketHttp(host, stream.str()); }void HttpConnect::getData(std::string host, std::string path, std::string get_content) { // GET请求方式 std::stringstream stream; stream < < "GET " < < path < < "?" < < get_content; stream < < " HTTP/1.0"; stream < < "Host: " < < host < < ""; 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"; stream < < "Connection:close"; socketHttp(host, stream.str()); }
推荐阅读
- 第一章 Android初体验
- android静态intent
- android开发ExpandableListView展开分组时不滚动不顶上去的解决方法
- web APP 开发之踩坑手记
- SciPy如何计算积分(详细用法看这里————)
- SciPy输入和输出
- SciPy使用FFTpack实现傅立叶变换
- Python SciPy教程介绍
- SciPy所有常数解释