代码下载地址:   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. Sqlite客户端的使用

    打开一个数据库sqlite3 ${databaseName} 查看当前打开的数据库.database 查看当前打开的数据库中的表.table 查看指定表结构(实际输出是建表语句).schema ${t ...

  2. zeppelin的安装与使用

    想起马上就能回家了,心情是按捺不住的激动,唉,还是继续努力吧,其实不希望那么快就回家,感觉回去了就意味着马上就要回来了,人真的是神奇呀 今天我们来使用zeppelin,这个就是可以把我们查找的数据可以 ...

  3. PowerCmd

    今天在手机上看慕课网,看到一个好玩的东西.Powercmd. 一开始的感觉是,妈的,我会cmd命令,为什么要用你的cmd? 后来,用了之后,感觉,嗯,还是Powercmd好用.功能强大. 我们来看看它 ...

  4. kafka生产者与消费者的生产消息与消费消息所遇到的问题

    当我们用API写kafka的时候 生产者生产消息,但是消费者接收不到消息?集群上启动消费者显示生产的消息.我们需要修改一下配置 (1)我们打开在虚拟机中修改kafka集群的配置文件 [root@spa ...

  5. 最短路径(Floyd法)

    最短路径法: 算法的主要思想是:单独一条边的路径也不一定是最佳路径. 从任意一条单边路径开始.所有两点之间的距离是边的权的和,(如果两点之间没有边相连, 则为无穷大). 对于每一对顶点 u 和 v,看 ...

  6. Django 运行 端口被占用 Error: That port is already in use

    本来运行项目:python manage.py runserver 8000 发现运行到结果报错: Error: That port is already in use 首先查看已存在端口号列表: $ ...

  7. 板载raid 安装Ubuntu 黑屏

    最近有碰到过产线反馈supermicro x10主板板载raid安装ubuntu桌面版 ,出现安装完成后黑屏,现象是能正常识别faker raid 但是第一次重启,就会出现黑屏,只有左上角广光标在闪, ...

  8. http协议--留

    1.http消息结构 *http客户端,即web浏览器,链接到服务器,向服务器发送一个http请求的目的 *http服务器,即web服务,接受请求,并向客户端发送http响应数据 http统一资源标识 ...

  9. Java分布式数据导出实践

    伴随业务发展日益剧增,对数据的要求越来越多也越来越高. 用户在浏览器发起导出请求--web服务器接收请求--请求后台获取数据--数据统计后生成excel或其他图标--响应给客户端 整个过程至少5步,才 ...

  10. 为什么js获取图片高度的值 都为0

    尼玛 这个问题困扰我好久~ 看别人取值都是 img.width 我取到的总是0: 终于发现取图片尺寸的时候 图片还没有加载完毕.所以在 <img id ='sImg' class='thumbI ...