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 手写相关推荐

  1. 如果有的明星不会使用计算机,盘点娱乐圈不会用电脑手机的10大原始明星:最后一位出书都是手写...

    原标题:盘点娱乐圈不会用电脑手机的10大原始明星:最后一位出书都是手写 刘雪华作为演艺界的老戏骨,演技是得到大家的认可的,可是她却不怎么懂得用电脑,所以她在自己的博客上发表声明,说自己不会用电脑,博客 ...

  2. 基于python的手写数字识别knn_KNN分类算法实现手写数字识别

    需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ...

  3. Python,OpenCV基于支持向量机SVM的手写数字OCR

    Python,OpenCV基于支持向量机SVM的手写数字OCR 1. 效果图 2. SVM及原理 2. 源码 2.1 SVM的手写数字OCR 2.2 非线性SVM 参考 上一节介绍了基于KNN的手写数 ...

  4. Python,OpenCV使用KNN来构建手写数字及字母识别OCR

    Python,OpenCV使用KNN来构建手写数字及字母识别OCR 1. 原理 1.1 手写数字识别 1.2 字母识别 2. 源码 2.1 手写数字OCR 2.2 字母OCR 参考 这篇博客将介绍如何 ...

  5. 深蓝学院第三章:基于卷积神经网络(CNN)的手写数字识别实践

    参看之前篇章的用全连接神经网络去做手写识别:https://blog.csdn.net/m0_37957160/article/details/114105389?spm=1001.2014.3001 ...

  6. 深蓝学院第二章:基于全连接神经网络(FCNN)的手写数字识别

    如何用全连接神经网络去做手写识别??? 使用的是jupyter notebook这个插件进行代码演示.(首先先装一个Anaconda的虚拟环境,然后自己构建一个自己的虚拟环境,然后在虚拟环境中安装ju ...

  7. 深度学习--TensorFlow(项目)识别自己的手写数字(基于CNN卷积神经网络)

    目录 基础理论 一.训练CNN卷积神经网络 1.载入数据 2.改变数据维度 3.归一化 4.独热编码 5.搭建CNN卷积神经网络 5-1.第一层:第一个卷积层 5-2.第二层:第二个卷积层 5-3.扁 ...

  8. 深度学习--TensorFlow(项目)Keras手写数字识别

    目录 效果展示 基础理论 1.softmax激活函数 2.神经网络 3.隐藏层及神经元最佳数量 一.数据准备 1.载入数据集 2.数据处理 2-1.归一化 2-2.独热编码 二.神经网络拟合 1.搭建 ...

  9. TensorFlow(8)卷积神经网络实战(2)手写卷积池化

    目录 一.获取并绘制图像 二.手写卷积 1.设置卷积核及权重 2.卷积 2-1.卷积实现 2-2. 限值 2-3.图像赋值 2-4.显示 卷积代码 三.手写池化 1.创建图像 2.遍历池化 3.显示图 ...

最新文章

  1. linux怎么创建牡蛎_文件amp;目录小技巧 | Linux后门系列
  2. Netty 4.1 Getting Start (翻译) + Demo
  3. Java线程的优先级
  4. 基于S2SH的电子商务网站系统性能优化
  5. 计算机专业联考335分,联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总...
  6. 代码实现从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt...
  7. java冒泡排序代码_JAVA
  8. 【flink】95-260-045-源码-检查点-CheckPoint
  9. c语言求浮点数矩阵的逆程序,逆矩阵求程序!!!谢谢
  10. mysql 相关操作
  11. IBatis .NET 开发学习笔记——简要介绍
  12. Atitit 标记语言ML(Markup Language) v4 目录 1. 标记语言ML Markup Language 1 1.1. 简介 1 2. 置标语言置标语言通常可以分为三类:标识性的
  13. jsessionid的删除
  14. 计算机网络练习题——一起肥学
  15. java pdf 转图片
  16. mysql在财务分析中的作用_财务报表分析的作用和目的
  17. 百度全景地图使用时提示flash版本过低 如何处理?
  18. 使用Excel中PPMT函数和IPMT函数进行等额本息还款的计算方法
  19. html 怎么转换,将 HTML 转换成任意你想要的形式!
  20. 自如_智能家居硬件测试

热门文章

  1. Android Service: 启动service, 停止service
  2. 计算机学科研究方向统计
  3. html中设置边框形状为齿状,在CSS中制作锯齿状的三角形边框
  4. 由于供不应求 部分新款Apple Watch机型推迟至11月交付
  5. 百度宣布7nm制程AI芯片“昆仑芯2”实现量产
  6. 洲明科技与意法半导体合作开发新一代LED显示屏
  7. 茅粉又疯狂!“蒂芙尼蓝”茅台炒至8500!
  8. iPhone 13外观四年以来首次改动:真的尽力了
  9. 腾讯音乐娱乐集团宣布管理层调整,着眼长远战略发展与行业生态布局
  10. 一加9系列全网预约量破200万:3月24日见!