大家平时有想过我们是如何下载某个文件的吗?当我们下载文件的时候,是由浏览器按照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文件能正常播放,则程序运行正确。