代码下载地址:   http://download.csdn.net/detail/mtour/8243527

最近写了个程序需要用到http通讯,由于flash空间比较小,没有考虑 libcurl库,用c++封装了一个http类,实现了http  文件上传和下载

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include <net/if.h>
  5. #include <arpa/inet.h>
  6. #include <sys/ioctl.h>
  7. #include "HttpClient.h"
  8. int main()
  9. {
  10. CHttpClient httpclient;
  11. char* pResponse=new char[32*1024];
  12. memset(pResponse,0,32*1024);
  13. int nRet=httpclient.ConnectServer("127.0.0.1", 80);
  14. if (0!=nRet) {
  15. return -1;
  16. }
  17. nRet=httpclient.HttpGet("/archives/user/10000025/jbox/m6cfaa74922bd00/JssConfig.xml", pResponse);
  18. if (0!=nRet) {
  19. printf("http get failed\n");
  20. return -1;
  21. }
  22. printf("------------- split line --------------  \n");
  23. char* pTmp=strstr(pResponse, "\r\n\r\n");
  24. pTmp+=4;
  25. printf("%s\n",pTmp);
  26. char url[128]="/file/";
  27. httpclient.HttpPostFile(url, "yourfile");
  28. getchar();
  29. //delete [] pResponse;
  30. return 0;
  31. }

类 接口定义

  1. #ifndef __Design__HttpClient__
  2. #define __Design__HttpClient__
  3. #include <stdio.h>
  4. #include "net/Net.h"
  5. #include <errno.h>
  6. #include <netdb.h>
  7. #include <sys/types.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. class CHttpClient {
  13. public:
  14. int ConnectServer(char* sHost,int nPort);
  15. int DisconnetServer();
  16. int HttpGet(char* sUrl,char* sResponse);
  17. int HttpPostFile(char* sUrl,char* sFileName);
  18. private:
  19. char m_sHost[32];
  20. char m_sHostIP[32];
  21. int  m_nPort;
  22. CTcp m_tcp;
  23. };
  24. #endif /* defined(__Design__HttpClient__) */

实现

    1. //
    2. //  HttpClient.cpp
    3. //  Design
    4. //
    5. //  Created by cwliu on 14-12-5.
    6. //  Copyright (c) 2014-12-08  cwliu. All rights reserved.
    7. //
    8. #include "HttpClient.h"
    9. int CHttpClient::ConnectServer(char* sHost,int nPort)
    10. {
    11. //gethostbyname
    12. struct hostent *h;
    13. if((h=gethostbyname(sHost))==NULL)
    14. {
    15. printf("gethostbyname failed\n");
    16. return -1;
    17. }
    18. printf("HostName :%s\n",h->h_name);
    19. sprintf(m_sHostIP, "%s",inet_ntoa(*((struct in_addr *)h->h_addr)));
    20. printf("IP Address :%s\n",m_sHostIP);
    21. m_nPort=nPort;
    22. int nRet=m_tcp.Open(nPort, m_sHostIP);
    23. if (0!=nRet) {
    24. printf("socket connect failed\n");
    25. return -1;
    26. }
    27. return 0;
    28. }
    29. int CHttpClient::DisconnetServer()
    30. {
    31. m_tcp.Close();
    32. return 0;
    33. }
    34. int CHttpClient::HttpGet(char* sUrl,char* sResponse)
    35. {
    36. char post[300],host[100],content_len[100];
    37. char *lpbuf,*ptmp;
    38. int len=0;
    39. lpbuf = NULL;
    40. const char *header2="User-Agent: linux_http_client Http 1.0\r\nCache-Control: no-cache\r\nContent-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\n";
    41. sprintf(post,"GET %s HTTP/1.0\r\n",sUrl);
    42. sprintf(host,"HOST: %s:%d\r\n",m_sHostIP,m_nPort);
    43. sprintf(content_len,"Content-Length: %d\r\n\r\n",1);
    44. len = strlen(post)+strlen(host)+strlen(header2)+strlen(content_len)+1;
    45. lpbuf = (char*)malloc(len);
    46. if(lpbuf==NULL)
    47. {
    48. return -1;
    49. }
    50. strcpy(lpbuf,post);
    51. strcat(lpbuf,host);
    52. strcat(lpbuf,header2);
    53. strcat(lpbuf,content_len);
    54. strcat(lpbuf," ");
    55. m_tcp.Send((unsigned char*)lpbuf,len);
    56. int nRet=m_tcp.Recv();
    57. if (nRet>0) {
    58. memcpy(sResponse,m_tcp.GetBuffer(), nRet);
    59. printf("%s\n",sResponse);
    60. }
    61. return 0;
    62. }
    63. int CHttpClient::HttpPostFile(char* sUrl,char* sFileName)
    64. {
    65. // check file and read it
    66. long  nFileLen=0;
    67. FILE* pFile=fopen(sFileName,"r");
    68. if (!pFile) {
    69. printf("read file failed\n");
    70. return -1;
    71. }
    72. fseek(pFile, 0, SEEK_END);
    73. nFileLen=ftell(pFile);
    74. printf("File length is %ld\n", nFileLen);
    75. if (!nFileLen) {
    76. printf("file len is 0\n");
    77. return -1;
    78. }
    79. fseek(pFile, 0, SEEK_SET);
    80. char* sFileText=new char[nFileLen+1];
    81. memset(sFileText, 0, nFileLen+1);
    82. fread(sFileText, 1, nFileLen, pFile);
    83. fclose(pFile);
    84. char* pBody=new char[32*1024];
    85. memset(pBody,0,32*1024);
    86. char sContentDisp[128];
    87. sprintf(sContentDisp, "Content-Disposition: form-data;name=\"file\";filename=\"%s\"\r\n",sFileName);
    88. strcat(pBody,"-------------------------------7db372eb000e2\r\n");
    89. strcat(pBody, sContentDisp);
    90. strcat(pBody, "Content-Type: text/plain\r\n\r\n");
    91. strcat(pBody, sFileText);
    92. strcat(pBody, "\r\n-------------------------------7db372eb000e2--\r\n");
    93. char post[300];
    94. sprintf(post,"POST %s HTTP/1.0\r\n",sUrl);
    95. char header[1024];
    96. char host[64];
    97. sprintf(host,"HOST: %s:%d\r\n",m_sHostIP,m_nPort);
    98. char sContentLen[32];
    99. sprintf(sContentLen, "Content-Length: %ld\r\n",strlen(pBody)+1);
    100. // read file and caluate the file
    101. sprintf(header, "%s","Accept:*/*\r\n");
    102. strcat(header, host);
    103. strcat(header, "User-Agent: JboxHttpClient\r\n");
    104. strcat(header, sContentLen);
    105. strcat(header,"Expect: 100-continue\r\n");
    106. strcat(header, "Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2\r\n\r\n");
    107. char* pBuf=new char[64*1024];
    108. memset(pBuf, 0, 64*1024);
    109. strcat(pBuf, post);
    110. strcat(pBuf, header);
    111. strcat(pBuf,pBody);
    112. printf("%s\n",pBuf);
    113. m_tcp.Send((unsigned char*)pBuf, strlen(pBuf)+1);
    114. char sResponse[1024];
    115. memset(sResponse, 0, 1024);
    116. int nRet=m_tcp.Recv();
    117. if (nRet>0) {
    118. memcpy(sResponse, m_tcp.GetBuffer(), nRet);
    119. printf("%s\n",sResponse);
    120. if (strstr(sResponse,"200"))
    121. {
    122. delete[] pBody;
    123. delete[] pBuf;
    124. printf("post file success \n");
    125. return 0;
    126. }
    127. else
    128. {
    129. printf("post file failed \n");
    130. }
    131. }
    132. delete[] pBody;
    133. delete[] pBuf;
    134. return -1;
    135. }

c++ 实现 http 上传和下载的更多相关文章

  1. win7下利用ftp实现华为路由器的上传和下载

    win7下利用ftp实现华为路由器的上传和下载 1.  Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...

  2. Java实现FTP文件与文件夹的上传和下载

    Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...

  3. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  4. Struts2入门(七)——Struts2的文件上传和下载

    一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...

  5. php实现文件上传与下载(上)

    php实现文件的上传与下载是一个挺基本的功能,一般网站多多少少都会有这样的需求在内,当然不是说所有的文件都可以被上传,那这网络就太没有安全性可言了.因为接触php时间不长,今天写练练手,随笔也就是公开 ...

  6. SecureCRT上传和下载文件

    SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...

  7. SpringMVC文件上传和下载

    上传与下载 1文件上传 1.1加入jar包 文件上传需要依赖的jar包 1.2配置部件解析器 解析二进制流数据. <?xml version="1.0" encoding=& ...

  8. 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节

    这一部分主要研究AFN的上传和下载功能,中间涉及到各种NSURLSessionTask的一些创建的解析和HTTPSessionManager对RESTful风格的web应用的支持,同时会穿插一点NSU ...

  9. 每天一个linux命令(26):用SecureCRT来上传和下载

    用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem.文 ...

  10. [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹

    摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...

随机推荐

  1. 笔记-爬虫-js代码解析

    笔记-爬虫-js代码解析 1.      js代码解析 1.1.    前言 在爬取网站时经常会有js生成关键信息,而且js代码是混淆过的. 以瓜子二手车为例,直接请求https://www.guaz ...

  2. 代码review的流程

    以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...

  3. Git-历史穿梭

    图形工具:gitk gitk是最早实现的一个图形化的Git版本库浏览器软件,基于tcl/tk实现,因此gitk非常简洁,本身就是一个1万多行的tcl脚本写成的.gitk的代码已经和Git的代码放在同一 ...

  4. Diycode开源项目 SitesListFragment分析

    1.效果预览 1.1.网站列表实际界面 1.2.注意这个界面没有继承SimpleRefreshRecycleFragment 前面的话题和新闻继承了SimpleRefreshRecyclerFragm ...

  5. 0x01.被动信息收集

    被动信息收集 基于公开渠道,不与目标系统产生直接交互,尽量避免留下痕迹(不进行大量扫描,正常交互范围) 信息收集内容 IP段 域名 邮件地址(定位邮件服务器,分为个人搭建和公网邮件系统) 文档图片数据 ...

  6. P2344 奶牛抗议

    P2344 奶牛抗议 题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为 ...

  7. android 获取图片

    Android获取手机或者内存卡里面的图片有两种方式 1.这是通过一种action Intent intent=new Intent(); intent.setAction(Intent.ACTION ...

  8. poj3348 Cows 凸包 叉积求多边形面积

    graham扫描法,参考yyb #include <algorithm> #include <iostream> #include <cstdio> #includ ...

  9. adb logcat 日志过滤

    方法 1.采用wpa_supplicant:s   *:v 排除wpa_supplicant标签 adb -s 01d32e89cb94d599 logcat -v time -s wpa_suppl ...

  10. Spark Streaming实例

    Spark Streaming实例分析 2015-02-02 21:00 4343人阅读 评论(0) 收藏 举报  分类: spark(11)  转载地址:http://www.aboutyun.co ...