http协议下的单线程下载

大家平时有想过我们是如何下载某个文件的吗?当我们下载文件的时候,是由浏览器按照http协议向服务器发送请求,我在本机上开启apache用着服务器,实现单线程下载。其实实现很简单,我们的程序代替浏览器做客户端,我们只需按照http协议向服务器发送请求即可,而http协议主要就是字符串的处理了。

//fileget.cc
#include <iostream>
#include <stdio.h>
#include <strings.h>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
using namespace std;
//服务器默认端口是80
const int httpport = 80;
//./fileget 192.168.163.128 index.html 其中index.html是要下载的文件名
int main(int argc, char *argv[])
{
    int sk = socket(AF_INET, SOCK_STREAM, 0);
    if(sk == -1)
    {
	cout << "create socket failed..." << endl;
	return 0;
    }

    struct sockaddr_in serveraddr;
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(httpport);
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    if(connect(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) != 0)
    {
	cout << "connect failed..." << endl;
	close(sk);
	return 0;
    }

    //将要向服务器发送的请求协议格式化到字符串中
    char buff[4096] = {'\0'};
    sprintf(buff,
	   "GET /%s HTTP/1.1\r\n"\
	   "Accept: */*\r\n"
	   "Referer: http://localhost/index.html\r\n"\
            "Accept-Language: zh-cn\r\n"\
            "Accept-Encoding: gzip, deflate\r\n"\
            "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"\
            "Host: localhost\r\n"\
	   "Connection: Keep-Alive\r\n"\
	   "\r\n",
	   argv[2]);

    //向服务器发送请求协议
    int len = send(sk, buff, sizeof(buff), 0);
    if(len < 0)
    {
	cout << "send http failed..." << endl;
	close(sk);
	return 0;
    }

    //在本机上创建一个同名文件,准备开始下载
    FILE *fp = fopen(argv[2], "w+");
    int size = 0;
    int flag = 0;
    char msg[4096] = {'\0'};
    //客户端接收的是服务器发送来的协议头和请求数据,请求的数据是两个回车换行之后的数据,所以要去掉两个回车换行
    while((size = recv(sk, msg, sizeof(msg), 0)) > 0)
    {
	//cout << msg << endl << endl;
	cout << "recv file..." << endl;
	if(flag == 0)
	{
	    char *p = strstr(msg, "\r\n\r\n");
	    fwrite(p + 4, 1, size - (int)(p + 4 -msg), fp);
	    flag++;
	}
	else
	{
	    fwrite(msg, 1, size, fp);
	}
    }

    cout << "file success..." << endl;
    fclose(fp);
    close(sk);
    return 0;
}

切换到root用户,开启本机的apache服务,开启后在浏览器中输入http://localhost/检查apache服务开启是否成功:

切换到root用户,在/var/www/html文件夹下新建一个index.html的文件:

程序运行截图:

下载成功后,index.html文件可以正常打开。同样的你可以复制一个mp3文件到/var/www/html目录下然后下载,如果下载后mp3文件能正常播放,则程序运行正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值