c++ 实现 http 上传和下载
代码下载地址: http://download.csdn.net/detail/mtour/8243527
最近写了个程序需要用到http通讯,由于flash空间比较小,没有考虑 libcurl库,用c++封装了一个http类,实现了http 文件上传和下载
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <net/if.h>
- #include <arpa/inet.h>
- #include <sys/ioctl.h>
- #include "HttpClient.h"
- int main()
- {
- CHttpClient httpclient;
- char* pResponse=new char[32*1024];
- memset(pResponse,0,32*1024);
- int nRet=httpclient.ConnectServer("127.0.0.1", 80);
- if (0!=nRet) {
- return -1;
- }
- nRet=httpclient.HttpGet("/archives/user/10000025/jbox/m6cfaa74922bd00/JssConfig.xml", pResponse);
- if (0!=nRet) {
- printf("http get failed\n");
- return -1;
- }
- printf("------------- split line -------------- \n");
- char* pTmp=strstr(pResponse, "\r\n\r\n");
- pTmp+=4;
- printf("%s\n",pTmp);
- char url[128]="/file/";
- httpclient.HttpPostFile(url, "yourfile");
- getchar();
- //delete [] pResponse;
- return 0;
- }
类 接口定义
- #ifndef __Design__HttpClient__
- #define __Design__HttpClient__
- #include <stdio.h>
- #include "net/Net.h"
- #include <errno.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <string.h>
- #include <stdlib.h>
- class CHttpClient {
- public:
- int ConnectServer(char* sHost,int nPort);
- int DisconnetServer();
- int HttpGet(char* sUrl,char* sResponse);
- int HttpPostFile(char* sUrl,char* sFileName);
- private:
- char m_sHost[32];
- char m_sHostIP[32];
- int m_nPort;
- CTcp m_tcp;
- };
- #endif /* defined(__Design__HttpClient__) */
实现
- //
- // HttpClient.cpp
- // Design
- //
- // Created by cwliu on 14-12-5.
- // Copyright (c) 2014-12-08 cwliu. All rights reserved.
- //
- #include "HttpClient.h"
- int CHttpClient::ConnectServer(char* sHost,int nPort)
- {
- //gethostbyname
- struct hostent *h;
- if((h=gethostbyname(sHost))==NULL)
- {
- printf("gethostbyname failed\n");
- return -1;
- }
- printf("HostName :%s\n",h->h_name);
- sprintf(m_sHostIP, "%s",inet_ntoa(*((struct in_addr *)h->h_addr)));
- printf("IP Address :%s\n",m_sHostIP);
- m_nPort=nPort;
- int nRet=m_tcp.Open(nPort, m_sHostIP);
- if (0!=nRet) {
- printf("socket connect failed\n");
- return -1;
- }
- return 0;
- }
- int CHttpClient::DisconnetServer()
- {
- m_tcp.Close();
- return 0;
- }
- int CHttpClient::HttpGet(char* sUrl,char* sResponse)
- {
- char post[300],host[100],content_len[100];
- char *lpbuf,*ptmp;
- int len=0;
- lpbuf = NULL;
- 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";
- sprintf(post,"GET %s HTTP/1.0\r\n",sUrl);
- sprintf(host,"HOST: %s:%d\r\n",m_sHostIP,m_nPort);
- sprintf(content_len,"Content-Length: %d\r\n\r\n",1);
- len = strlen(post)+strlen(host)+strlen(header2)+strlen(content_len)+1;
- lpbuf = (char*)malloc(len);
- if(lpbuf==NULL)
- {
- return -1;
- }
- strcpy(lpbuf,post);
- strcat(lpbuf,host);
- strcat(lpbuf,header2);
- strcat(lpbuf,content_len);
- strcat(lpbuf," ");
- m_tcp.Send((unsigned char*)lpbuf,len);
- int nRet=m_tcp.Recv();
- if (nRet>0) {
- memcpy(sResponse,m_tcp.GetBuffer(), nRet);
- printf("%s\n",sResponse);
- }
- return 0;
- }
- int CHttpClient::HttpPostFile(char* sUrl,char* sFileName)
- {
- // check file and read it
- long nFileLen=0;
- FILE* pFile=fopen(sFileName,"r");
- if (!pFile) {
- printf("read file failed\n");
- return -1;
- }
- fseek(pFile, 0, SEEK_END);
- nFileLen=ftell(pFile);
- printf("File length is %ld\n", nFileLen);
- if (!nFileLen) {
- printf("file len is 0\n");
- return -1;
- }
- fseek(pFile, 0, SEEK_SET);
- char* sFileText=new char[nFileLen+1];
- memset(sFileText, 0, nFileLen+1);
- fread(sFileText, 1, nFileLen, pFile);
- fclose(pFile);
- char* pBody=new char[32*1024];
- memset(pBody,0,32*1024);
- char sContentDisp[128];
- sprintf(sContentDisp, "Content-Disposition: form-data;name=\"file\";filename=\"%s\"\r\n",sFileName);
- strcat(pBody,"-------------------------------7db372eb000e2\r\n");
- strcat(pBody, sContentDisp);
- strcat(pBody, "Content-Type: text/plain\r\n\r\n");
- strcat(pBody, sFileText);
- strcat(pBody, "\r\n-------------------------------7db372eb000e2--\r\n");
- char post[300];
- sprintf(post,"POST %s HTTP/1.0\r\n",sUrl);
- char header[1024];
- char host[64];
- sprintf(host,"HOST: %s:%d\r\n",m_sHostIP,m_nPort);
- char sContentLen[32];
- sprintf(sContentLen, "Content-Length: %ld\r\n",strlen(pBody)+1);
- // read file and caluate the file
- sprintf(header, "%s","Accept:*/*\r\n");
- strcat(header, host);
- strcat(header, "User-Agent: JboxHttpClient\r\n");
- strcat(header, sContentLen);
- strcat(header,"Expect: 100-continue\r\n");
- strcat(header, "Content-Type:multipart/form-data;boundary=-----------------------------7db372eb000e2\r\n\r\n");
- char* pBuf=new char[64*1024];
- memset(pBuf, 0, 64*1024);
- strcat(pBuf, post);
- strcat(pBuf, header);
- strcat(pBuf,pBody);
- printf("%s\n",pBuf);
- m_tcp.Send((unsigned char*)pBuf, strlen(pBuf)+1);
- char sResponse[1024];
- memset(sResponse, 0, 1024);
- int nRet=m_tcp.Recv();
- if (nRet>0) {
- memcpy(sResponse, m_tcp.GetBuffer(), nRet);
- printf("%s\n",sResponse);
- if (strstr(sResponse,"200"))
- {
- delete[] pBody;
- delete[] pBuf;
- printf("post file success \n");
- return 0;
- }
- else
- {
- printf("post file failed \n");
- }
- }
- delete[] pBody;
- delete[] pBuf;
- return -1;
- }
c++ 实现 http 上传和下载的更多相关文章
- win7下利用ftp实现华为路由器的上传和下载
win7下利用ftp实现华为路由器的上传和下载 1. Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- Struts2入门(七)——Struts2的文件上传和下载
一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...
- php实现文件上传与下载(上)
php实现文件的上传与下载是一个挺基本的功能,一般网站多多少少都会有这样的需求在内,当然不是说所有的文件都可以被上传,那这网络就太没有安全性可言了.因为接触php时间不长,今天写练练手,随笔也就是公开 ...
- SecureCRT上传和下载文件
SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...
- SpringMVC文件上传和下载
上传与下载 1文件上传 1.1加入jar包 文件上传需要依赖的jar包 1.2配置部件解析器 解析二进制流数据. <?xml version="1.0" encoding=& ...
- 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节
这一部分主要研究AFN的上传和下载功能,中间涉及到各种NSURLSessionTask的一些创建的解析和HTTPSessionManager对RESTful风格的web应用的支持,同时会穿插一点NSU ...
- 每天一个linux命令(26):用SecureCRT来上传和下载
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem.文 ...
- [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...
随机推荐
- python Re库的介绍
re库的贪婪匹配和最小匹配 后面跟着?变为最小匹配
- Python文章推荐1
Table of Contents 1. 分享最近看到的python相关的几篇好文(我只是想偷懒) 1.1. 形象解释了什么是GIL 1.2. 知乎上 Pythonic 相关 1.3. evil &q ...
- 5.Mongodb聚合
聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 1.管道 管道在Uni ...
- 1082: [SCOI2005]栅栏
链接 思路 二分+搜索+剪枝. 首先二分一个答案,表示最多可以切出x块.(一个结论:切出的一定是从较小的前x块.如果一个木材可以满足很多个需要的木材,那么切出最小的,就意味着以后再选时的机会更多.) ...
- Docker构建nginx+uwsgi+flask镜像(二)
Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...
- 《Cracking the Coding Interview》——第16章:线程与锁——题目2
2014-04-27 19:14 题目:如何测量上下文切换的时间? 解法:首先,上下文切换是什么,一搜就知道.对于这么一个极短的时间,要测量的话,可以通过放大N倍的方法.比如:有A和B两件事,并且经常 ...
- python实现单链表的反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/env python #coding = utf-8 ...
- android中dumpsys命令使用
转自:https://testerhome.com/topics/1462 adb shell dumpsys,默认打印出当前系统所有service信息,在后面可加上具体的服务名 需要列出当前运行的服 ...
- php 代码段执行时间
<?php //程序运行时间 $starttime = explode(' ',microtime()); echo microtime(); /*········以下是代码区······· ...
- leetcode 179. 最大数 解题报告
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说明: 输出结果 ...