httpclient 手写
http client c++ 代码
为何手写
### 很多c ,c++ 的获取http协议内容,get或者post 的时候,会犯难,是自己写还是使用现成的库,动辄编译一个库是比较消耗时间的,
能自己手写就不要随便编译库了。
#include <stdio.h>
#include <sstream>
#ifdef _WIN32
#include <WinSock2.h>
#endif
using namespace std;
//获取content-length 的长度,截取
int contentlen_get(char * pos, char * end)
{char buf[16];char * t = pos;while (*(t) == ' ')t++;char * e = t;int i = 0;while ((*e) != '\r'){buf[i++] = *e;e++;if (i > 14)return -1;}buf[i] = '\0';return atoi(buf);//return 0;
}class http_connect
{public:http_connect::http_connect(){#ifdef _WIN32//此处一定要初始化一下,否则gethostbyname返回一直为空WSADATA wsa = { 0 };WSAStartup(MAKEWORD(2, 2), &wsa);
#endif}http_connect::~http_connect(){WSACleanup();}int http_connect::socketHttp(const char* host, unsigned short port, const char *request,char *buf, int buflen){SOCKET sockfd;struct sockaddr_in address;struct hostent *server;sockfd = socket(AF_INET, SOCK_STREAM, 0);address.sin_family = AF_INET;address.sin_port = htons(port);//getaddrinfo()server = gethostbyname(host);memcpy((char *)&address.sin_addr.s_addr, (char*)server->h_addr, server->h_length);#ifdef _WIN32int ret = 0;//int timeout = 2000; //2s//这样做在Linux环境下是不会产生效果的,须如下定义:struct timeval timeout = { 2,0 };//设置发送超时setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(struct timeval));//设置接收超时setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));// ret = setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout));// ret = setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
#endifif (-1 == connect(sockfd, (struct sockaddr *)&address, sizeof(address))) {#ifdef _WIN32 closesocket(sockfd);
#endifprintf("connection error!\n");return -1;}#ifdef WIN32int iRes = send(sockfd, request, (int)strlen(request), 0);if (iRes == SOCKET_ERROR) {printf("send failed: %d\n", WSAGetLastError());closesocket(sockfd);return -1;}
#elsestruct timeval timeout = { 2,0 };//2sint ret = setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout));int ret = setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));write(sockfd, request, strlen(request));
#endif//char * buf = new char[64 * 1024];int offset = 0;int rc = 0;do {buflen = buflen - offset;if (buflen > 0){#ifdef WIN32rc = recv(sockfd, buf + offset, buflen, MSG_WAITALL);
#elserc = read(sockfd, buf + offset, 1024);
#endif}if (rc > 0) {offset += rc;printf("Bytes received: %d\n", rc);}else if (rc == 0){printf("Connection closed\n");}else{printf("recv failed: %d\n", rc);}} while (rc > 0);#ifdef WIN32closesocket(sockfd);
#elseclose(sockfd);
#endifbuf[offset] = 0;const char * content_length = strstr(buf, "Content-Length:");const char * pos = strstr(buf, "\r\n\r\n");if (content_length == NULL || pos == NULL){return -1;}else{content_length += 15;int len = contentlen_get(" 8\r\n", NULL);if (len <= 0){return -1;}//while()pos += 4;strncpy(buf, pos, len);buf[len] = '\0';printf("%s\n", pos);}return 0;
#if 0size_t r = _data.rfind("\r\n\r\n");cout << "r is " << r << endl;//cout << _data << std::endl;string re = _data.substr(409 + 4);cout << "the re is " << re << endl;
#endif}int http_connect::postData(const char* host, unsigned short port, const char* path, const char* post_content,char *buf, int buflen){//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/json\r\n";//stream << "Content-Type:application/x-www-form-urlencoded\r\n";stream << "Content-Length:" << strlen(post_content) << "\r\n";stream << "Connection:close\r\n\r\n";stream << post_content;//string temp = stream.str();//cout << "temp is :" << temp << endl;return socketHttp(host, port, stream.str().c_str(),buf, buflen);}int http_connect::getData(const char* host, unsigned short port, const char* path, const char* get_content,char * buf, int buflen){//GET请求方式std::stringstream stream;if (get_content != NULL && strlen(get_content) > 0)//if (strlen(get_content) > 0)stream << "GET " << path << "?" << get_content;elsestream << "GET " << 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 << "Connection:close\r\n\r\n";//string temp = stream.str();//cout << "len is " << temp.size() << endl;return socketHttp(host, port, stream.str().c_str(),buf,buflen);}
};
以上为基本class ,如何调用,比较简单
int main(int argc, char* argv[])
{//int a = contentlen_get(" 8\r\n", NULL);//printf("%d\n", a);char buffer[10240];http_connect hc;if (hc.getData("127.0.0.1", 80, "/test", NULL, buffer, 10240) == 0){printf("receive json:");printf(buffer);}else{printf("连接错误");}return 0;
}
httpclient 手写相关推荐
- 如果有的明星不会使用计算机,盘点娱乐圈不会用电脑手机的10大原始明星:最后一位出书都是手写...
原标题:盘点娱乐圈不会用电脑手机的10大原始明星:最后一位出书都是手写 刘雪华作为演艺界的老戏骨,演技是得到大家的认可的,可是她却不怎么懂得用电脑,所以她在自己的博客上发表声明,说自己不会用电脑,博客 ...
- 基于python的手写数字识别knn_KNN分类算法实现手写数字识别
需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ...
- Python,OpenCV基于支持向量机SVM的手写数字OCR
Python,OpenCV基于支持向量机SVM的手写数字OCR 1. 效果图 2. SVM及原理 2. 源码 2.1 SVM的手写数字OCR 2.2 非线性SVM 参考 上一节介绍了基于KNN的手写数 ...
- Python,OpenCV使用KNN来构建手写数字及字母识别OCR
Python,OpenCV使用KNN来构建手写数字及字母识别OCR 1. 原理 1.1 手写数字识别 1.2 字母识别 2. 源码 2.1 手写数字OCR 2.2 字母OCR 参考 这篇博客将介绍如何 ...
- 深蓝学院第三章:基于卷积神经网络(CNN)的手写数字识别实践
参看之前篇章的用全连接神经网络去做手写识别:https://blog.csdn.net/m0_37957160/article/details/114105389?spm=1001.2014.3001 ...
- 深蓝学院第二章:基于全连接神经网络(FCNN)的手写数字识别
如何用全连接神经网络去做手写识别??? 使用的是jupyter notebook这个插件进行代码演示.(首先先装一个Anaconda的虚拟环境,然后自己构建一个自己的虚拟环境,然后在虚拟环境中安装ju ...
- 深度学习--TensorFlow(项目)识别自己的手写数字(基于CNN卷积神经网络)
目录 基础理论 一.训练CNN卷积神经网络 1.载入数据 2.改变数据维度 3.归一化 4.独热编码 5.搭建CNN卷积神经网络 5-1.第一层:第一个卷积层 5-2.第二层:第二个卷积层 5-3.扁 ...
- 深度学习--TensorFlow(项目)Keras手写数字识别
目录 效果展示 基础理论 1.softmax激活函数 2.神经网络 3.隐藏层及神经元最佳数量 一.数据准备 1.载入数据集 2.数据处理 2-1.归一化 2-2.独热编码 二.神经网络拟合 1.搭建 ...
- TensorFlow(8)卷积神经网络实战(2)手写卷积池化
目录 一.获取并绘制图像 二.手写卷积 1.设置卷积核及权重 2.卷积 2-1.卷积实现 2-2. 限值 2-3.图像赋值 2-4.显示 卷积代码 三.手写池化 1.创建图像 2.遍历池化 3.显示图 ...
最新文章
- linux怎么创建牡蛎_文件amp;目录小技巧 | Linux后门系列
- Netty 4.1 Getting Start (翻译) + Demo
- Java线程的优先级
- 基于S2SH的电子商务网站系统性能优化
- 计算机专业联考335分,联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总...
- 代码实现从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt...
- java冒泡排序代码_JAVA
- 【flink】95-260-045-源码-检查点-CheckPoint
- c语言求浮点数矩阵的逆程序,逆矩阵求程序!!!谢谢
- mysql 相关操作
- IBatis .NET 开发学习笔记——简要介绍
- Atitit 标记语言ML(Markup Language) v4 目录 1. 标记语言ML Markup Language	1 1.1. 简介	1 2. 置标语言置标语言通常可以分为三类:标识性的
- jsessionid的删除
- 计算机网络练习题——一起肥学
- java pdf 转图片
- mysql在财务分析中的作用_财务报表分析的作用和目的
- 百度全景地图使用时提示flash版本过低 如何处理?
- 使用Excel中PPMT函数和IPMT函数进行等额本息还款的计算方法
- html 怎么转换,将 HTML 转换成任意你想要的形式!
- 自如_智能家居硬件测试
热门文章
- Android Service: 启动service, 停止service
- 计算机学科研究方向统计
- html中设置边框形状为齿状,在CSS中制作锯齿状的三角形边框
- 由于供不应求 部分新款Apple Watch机型推迟至11月交付
- 百度宣布7nm制程AI芯片“昆仑芯2”实现量产
- 洲明科技与意法半导体合作开发新一代LED显示屏
- 茅粉又疯狂!“蒂芙尼蓝”茅台炒至8500!
- iPhone 13外观四年以来首次改动:真的尽力了
- 腾讯音乐娱乐集团宣布管理层调整,着眼长远战略发展与行业生态布局
- 一加9系列全网预约量破200万:3月24日见!