c++ 实现 http 上传和下载

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

 

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

 

      

[cpp] view plain copy

 
 

  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.   
  9.   
  10.   
  11. int main()  
  12. {  
  13.     CHttpClient httpclient;  
  14.       
  15.     char* pResponse=new char[32*1024];  
  16.     memset(pResponse,0,32*1024);  
  17.       
  18.     int nRet=httpclient.ConnectServer("127.0.0.1", 80);  
  19.       
  20.     if (0!=nRet) {  
  21.         return -1;  
  22.     }  
  23.       
  24.     nRet=httpclient.HttpGet("/archives/user/10000025/jbox/m6cfaa74922bd00/JssConfig.xml", pResponse);  
  25.       
  26.     if (0!=nRet) {  
  27.         printf("http get failed\n");  
  28.         return -1;  
  29.     }  
  30.       
  31.     printf("------------- split line --------------  \n");  
  32.       
  33.     char* pTmp=strstr(pResponse, "\r\n\r\n");  
  34.     pTmp+=4;  
  35.       
  36.     printf("%s\n",pTmp);  
  37.   
  38.       
  39.     char url[128]="/file/";   
  40.       
  41.     httpclient.HttpPostFile(url, "yourfile");  
  42.       
  43.     getchar();  
  44.     //delete [] pResponse;  
  45.     return 0;  
  46. }  

 

 

类 接口定义

 

 

[cpp] view plain copy

 

 

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

实现

 

 

 

[cpp] view plain copy

 

 

    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.   
    9. #include "HttpClient.h"  
    10.   
    11. int CHttpClient::ConnectServer(char* sHost,int nPort)  
    12. {  
    13.     //gethostbyname  
    14.       
    15.     struct hostent *h;  
    16.      
    17.     if((h=gethostbyname(sHost))==NULL)  
    18.     {  
    19.         printf("gethostbyname failed\n");  
    20.         return -1;  
    21.     }  
    22.     printf("HostName :%s\n",h->h_name);  
    23.     sprintf(m_sHostIP, "%s",inet_ntoa(*((struct in_addr *)h->h_addr)));  
    24.     printf("IP Address :%s\n",m_sHostIP);  
    25.     m_nPort=nPort;  
    26.       
    27.     int nRet=m_tcp.Open(nPort, m_sHostIP);  
    28.     if (0!=nRet) {  
    29.         printf("socket connect failed\n");  
    30.         return -1;  
    31.     }  
    32.     return 0;  
    33. }  
    34. int CHttpClient::DisconnetServer()  
    35. {  
    36.     m_tcp.Close();  
    37.     return 0;  
    38. }  
    39.   
    40. int CHttpClient::HttpGet(char* sUrl,char* sResponse)  
    41. {  
    42.       
    43.     char post[300],host[100],content_len[100];  
    44.     char *lpbuf,*ptmp;  
    45.     int len=0;  
    46.     lpbuf = NULL;  
    47.     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";  
    48.     sprintf(post,"GET %s HTTP/1.0\r\n",sUrl);  
    49.     sprintf(host,"HOST: %s:%d\r\n",m_sHostIP,m_nPort);  
    50.     sprintf(content_len,"Content-Length: %d\r\n\r\n",1);  
    51.     len = strlen(post)+strlen(host)+strlen(header2)+strlen(content_len)+1;  
    52.     lpbuf = (char*)malloc(len);  
    53.     if(lpbuf==NULL)  
    54.     {  
    55.         return -1;  
    56.     }  
    57.     strcpy(lpbuf,post);  
    58.     strcat(lpbuf,host);  
    59.     strcat(lpbuf,header2);  
    60.     strcat(lpbuf,content_len);  
    61.     strcat(lpbuf," ");  
    62.       
    63.     m_tcp.Send((unsigned char*)lpbuf,len);  
    64.       
    65.     int nRet=m_tcp.Recv();  
    66.     if (nRet>0) {  
    67.         memcpy(sResponse,m_tcp.GetBuffer(), nRet);  
    68.         printf("%s\n",sResponse);  
    69.     }  
    70.       
    71.     return 0;  
    72. }  
    73.   
    74. int CHttpClient::HttpPostFile(char* sUrl,char* sFileName)  
    75. {  
    76.     // check file and read it  
    77.     long  nFileLen=0;  
    78.       
    79.     FILE* pFile=fopen(sFileName,"r");  
    80.     if (!pFile) {  
    81.         printf("read file failed\n");  
    82.         return -1;  
    83.     }  
    84.       
    85.     fseek(pFile, 0, SEEK_END);  
    86.     nFileLen=ftell(pFile);  
    87.     printf("File length is %ld\n", nFileLen);  
    88.       
    89.     if (!nFileLen) {  
    90.         printf("file len is 0\n");  
    91.         return -1;  
    92.     }  
    93.       
    94.     fseek(pFile, 0, SEEK_SET);  
    95.     char* sFileText=new char[nFileLen+1];  
    96.     memset(sFileText, 0, nFileLen+1);  
    97.       
    98.     fread(sFileText, 1, nFileLen, pFile);  
    99.       
    100.     fclose(pFile);  
    101.   
    102.   
    103.     char* pBody=new char[32*1024];  
    104.     memset(pBody,0,32*1024);  
    105.   
    106.     char sContentDisp[128];  
    107.     sprintf(sContentDisp, "Content-Disposition: form-data;name=\"file\";filename=\"%s\"\r\n",sFileName);  
    108.     strcat(pBody,"-------------------------------7db372eb000e2\r\n");  
    109.     strcat(pBody, sContentDisp);  
    110.     strcat(pBody, "Content-Type: text/plain\r\n\r\n");      
    111.     strcat(pBody, sFileText);      
    112.     strcat(pBody, "\r\n-------------------------------7db372eb000e2--\r\n");  
    113.       
    114.       
    115.     char post[300];  
    116.     sprintf(post,"POST %s HTTP/1.0\r\n",sUrl);  
    117.     char header[1024];  
    118.     char host[64];  
    119.     sprintf(host,"HOST: %s:%d\r\n",m_sHostIP,m_nPort);  
    120.       
    121.       
    122.     char sContentLen[32];  
    123.     sprintf(sContentLen, "Content-Length: %ld\r\n",strlen(pBody)+1);  
    124.   
    125.     // read file and caluate the file  
    126.       
    127.       
    128.     sprintf(header, "%s","Accept:*/*\r\n");      
    129.     strcat(header, host);      
    130.     strcat(header, "User-Agent: JboxHttpClient\r\n");  
    131.     strcat(header, sContentLen);  
    132.     strcat(header,"Expect: 100-continue\r\n");  
    133.     strcat(header, "Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2\r\n\r\n");  
    134.       
    135.     char* pBuf=new char[64*1024];  
    136.     memset(pBuf, 0, 64*1024);  
    137.     strcat(pBuf, post);  
    138.     strcat(pBuf, header);   
    139.     strcat(pBuf,pBody);  
    140.       
    141.       
    142.     printf("%s\n",pBuf);  
    143.       
    144.     m_tcp.Send((unsigned char*)pBuf, strlen(pBuf)+1);  
    145.       
    146.     char sResponse[1024];  
    147.     memset(sResponse, 0, 1024);  
    148.       
    149.     int nRet=m_tcp.Recv();  
    150.     if (nRet>0) {  
    151.         memcpy(sResponse, m_tcp.GetBuffer(), nRet);  
    152.         printf("%s\n",sResponse);  
    153.   
    154.         if (strstr(sResponse,"200"))  
    155.         {  
    156.             delete[] pBody;  
    157.             delete[] pBuf;  
    158.             printf("post file success \n");  
    159.             return 0;  
    160.         }  
    161.         else  
    162.         {  
    163.             printf("post file failed \n");  
    164.         }         
    165.     }     
    166.     delete[] pBody;  
    167.     delete[] pBuf;  
    168.     return -1;  
    169. }  
时间: 2024-08-29 12:55:56

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

使用oss c sdk自定义上传和下载callback

       前段时间使用阿里云官网提供的OSS C SDK上传和下载数据,想在上传和下载过程中对数据进行一些简单的自定义预处理,看了一下oss c sdk的具体实现,大致了解如何通过自定义上传和下载的callback达到上述目的,这里做一个简单的分享.        OSS C SDK在上传和下载数据时使用了CURL进行通信,之前简单学习过CURL的一些知识,知道CURL提供了一系列Callback,在上传下载时对数据进行一些处理,大家感兴趣的话可以参考: http://curl.haxx.s

解决WordPress的文件上传与下载问题

网上流传了一些修改WordPress文件上传大小限制的做法,大部分是一个版本,而且说得不够准确,特别是对于生手的指导性不强,本文总结了使用Wordpress博客的朋友在文件上传与下载时大小限制,及文件上传不成功之路的 一些问题总结与解决方法. 一.文件上传大小限制 最有效的办法:需要修改PHP配置来调整限制. 如为使上传大小限制为80M,将以下代码加入PHP配置: file_uploads =On upload_max_filesize =80M post_max_size =80M 针对不同的

linux基础命令(26) 用SecureCRT来上传和下载文件

用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的, SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. 文件传输协议: 文件传输是数据交换的主要形式.在进行文件传 输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议.这个协议包括了文件的识别.传送的起 止时间.错误的判断与纠正等内容.常见的传输协议有以下几种: ASCII:这是最快的传输协议,但只能传送文本文件. Xmode

WSE3.0构建Web服务安全(4) MTOM消息传输优化和文件上传、下载

MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使用MTOM?这些疑问,本文WSE3.0构建Web服务安全系列文章的第4节:MTOM消息优化传输机制和文件上传.下载--将为您一一解答.本节结构为1.MTOM基础概念2.WSE3.0工具配置MTOM3.代码实现与分析4.总结.最后附上实现代码供大家参考. WSE3.0中引入MTOM机制,给我们借助WS

如何在SecureCRT上安装使用lrzsz上传和下载

系统环境:CentOS 6.3_64bit 本文档描述了如何在SecureCRT上安装使用lrzsz上传和下载. SecureCRT是一个多标签远程登录终端,使用它可以远程连接Telnet 或SSH 服务.系统管理员使用它来连接linux服务器. lrzsz是一个搭配SecureCRT使用的上传下载工具,能方便的在本地PC机和远程服务器之间传输文件. lrzsz的安装很方便,你可以从系统安装盘或者是互联网上的yum源中得到它. 由上述现象可知,很可能没有安装相应的软件包:sz .rz  命令所需

Linux使用SecureCRT上传和下载文件教程

  Linux使用SecureCRT上传和下载文件教程:         我们在日常工作中,经常会需要上传或者下载一些文件,Linux用户也不例外.那么在Linux系统中,有什么比较好用的上传下载工具呢?今天小编就教大家如何使用SecureCRT上传或下载文件. 具体操作步骤: 1.需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运行命令yum install lrzsz. 2.安装完成后就可以使用rz命令上传本地的文件到linux

linux系统怎么用SecureCRT上传和下载文件?

  1.需要上传或者下载,需要使用rz和sz命令.如果linux上没有这两个命令工具,则需要先安装.可以使用yum安装.运行命令yum install lrzsz. 2.安装完成后就可以使用rz命令上传本地的文件到linux平台.运行rz命令,会弹出选择文件的对话框. 3.选择需要上传的文件所在的文件夹,然后点击文件.然后再点击添加按钮,"发送的文件"框中就会显示需要上传的文件.点击确定按钮,就能完成上传. 4.如果需要下载linux上的文件,使用sz命令.sz加上文件完整路径,比如:

java web 怎么上传ppt,excel是可以上传下载的,但是ppt怎么做到上传和下载

问题描述 java web 怎么上传ppt,excel是可以上传下载的,但是ppt怎么做到上传和下载 用的oracle数据库,java是springmvc+mybatis 解决方案 如何上传PPT到博客 解决方案二: 上传 和 下载 的方法 不会因为后缀名不一样而有改变.

上传或下载当文件名包含有特殊字符&amp;quot;#&amp;quot;的处理

http://www.cnblogs.com/luointer123/archive/2010/03/10/1682728.html 在上传或下载文件时,当文件名包含有"#"特殊字符时,上传以后的文件会被改名字,造成下载也下载不了. 如类似以下的代码:             Uri uri = new Uri(targetUrl);//targetUrl对应文件的绝对路径             System.Net.HttpWebRequest request = (HttpWeb

使用springMVC实现文件上传和下载之环境配置与上传

最近的项目中用到了文件的上传和下载功能,任务分配给了其他的同时完成.如今项目结束告一段落,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 一. 基础配置: maven导包及配置pom.xml,导包时除开springmvc的基础依赖外,需要导入文件上传下载时用到的commons-io.jsr和commons-fileupload.jar: [html] view plain copy   <project xmlns="http://maven.apache.org/POM/4