• c++ 实现 http 上传和下载


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

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

          

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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 ");  
    28.         return -1;  
    29.     }  
    30.       
    31.     printf("------------- split line --------------   ");  
    32.       
    33.     char* pTmp=strstr(pResponse, " ");  
    34.     pTmp+=4;  
    35.       
    36.     printf("%s ",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
     
     在CODE上查看代码片派生到我的代码片
    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
     
     在CODE上查看代码片派生到我的代码片
      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 ");  
      20.         return -1;  
      21.     }  
      22.     printf("HostName :%s ",h->h_name);  
      23.     sprintf(m_sHostIP, "%s",inet_ntoa(*((struct in_addr *)h->h_addr)));  
      24.     printf("IP Address :%s ",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 ");  
      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 Cache-Control: no-cache Content-Type: application/x-www-form-urlencoded Accept: */* ";  
      48.     sprintf(post,"GET %s HTTP/1.0 ",sUrl);  
      49.     sprintf(host,"HOST: %s:%d ",m_sHostIP,m_nPort);  
      50.     sprintf(content_len,"Content-Length: %d ",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 ",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 ");  
      82.         return -1;  
      83.     }  
      84.       
      85.     fseek(pFile, 0, SEEK_END);  
      86.     nFileLen=ftell(pFile);  
      87.     printf("File length is %ld ", nFileLen);  
      88.       
      89.     if (!nFileLen) {  
      90.         printf("file len is 0 ");  
      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" ",sFileName);  
      108.     strcat(pBody,"-------------------------------7db372eb000e2 ");  
      109.     strcat(pBody, sContentDisp);  
      110.     strcat(pBody, "Content-Type: text/plain ");      
      111.     strcat(pBody, sFileText);      
      112.     strcat(pBody, " -------------------------------7db372eb000e2-- ");  
      113.       
      114.       
      115.     char post[300];  
      116.     sprintf(post,"POST %s HTTP/1.0 ",sUrl);  
      117.     char header[1024];  
      118.     char host[64];  
      119.     sprintf(host,"HOST: %s:%d ",m_sHostIP,m_nPort);  
      120.       
      121.       
      122.     char sContentLen[32];  
      123.     sprintf(sContentLen, "Content-Length: %ld ",strlen(pBody)+1);  
      124.   
      125.     // read file and caluate the file  
      126.       
      127.       
      128.     sprintf(header, "%s","Accept:*/* ");      
      129.     strcat(header, host);      
      130.     strcat(header, "User-Agent: JboxHttpClient ");  
      131.     strcat(header, sContentLen);  
      132.     strcat(header,"Expect: 100-continue ");  
      133.     strcat(header, "Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2 ");  
      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 ",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 ",sResponse);  
      153.   
      154.         if (strstr(sResponse,"200"))  
      155.         {  
      156.             delete[] pBody;  
      157.             delete[] pBuf;  
      158.             printf("post file success  ");  
      159.             return 0;  
      160.         }  
      161.         else  
      162.         {  
      163.             printf("post file failed  ");  
      164.         }         
      165.     }     
      166.     delete[] pBody;  
      167.     delete[] pBuf;  
      168.     return -1;  
      169. }  
  • 相关阅读:
    深入Java微服务之网关系列1:什么是网关
    logstash系列快速调试demo
    logstash系列input和output方案预研结果
    99zeppelin使用和一些预研
    filebeat系列如何给日志增加一些额外的标记字段
    filebeat系列快速调试demo
    logstash系列使用中的一些点
    Redis常用命令
    springboot使用外置tomcat
    Redis持久化和事务
  • 原文地址:https://www.cnblogs.com/lidabo/p/6405389.html
Copyright © 2020-2023  润新知