linux 简单的下载down

本文介绍了一个使用C语言实现的简单HTTP文件下载程序。该程序通过解析URL获取主机名及资源路径,进而建立TCP连接并发送HTTP GET请求来下载文件。文章展示了如何处理HTTP响应头部信息,提取文件长度,并逐步读取文件主体部分。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>

int main ( int argc, char *argv[] )
{
int sockfd;
struct sockaddr_in server_addr;
char host[ 256 ] = "";
char *p_start = NULL;
char *p_end = NULL;

printf("--argv[1] = %s\n", argv[1] );
p_start = strstr( argv[1], "http://" );
p_start += strlen("http://");
p_end = strstr( p_start, "/" );
if( p_end == NULL )
strcpy( host, p_start );
else
memcpy( host, p_start , p_end-p_start);
printf("--%s---\n", host);

struct hostent *host_addr = NULL;
if((host_addr=gethostbyname( host ))==NULL)/*取得主机IP地址*/
{
fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
exit(1);
}

FILE *fp = fopen("./text.flv", "w+");

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(80);
server_addr.sin_addr=*((struct in_addr *)host_addr->h_addr);

sockfd = socket(AF_INET, SOCK_STREAM, 0);

printf("sockfd - %d\n", sockfd);

printf("host: %s-----\n%s", host, p_end );
char request[ 1024 ] = "";
sprintf(request, "GET %s HTTP/1.1\r\nRange: bytes=10000-\r\nHost: %s\r\nAccept-Encoding: defalte\r\n\r\n", p_end, host );
// sprintf(request, "GET %s?start=300 HTTP/1.1\r\nHost: %s\r\nAccept-Encoding: defalte\r\n\r\n", p_end, host );
// strcpy( request, "GET /img/image/1703bf33a87e950352abcaef36a5143fbf2b3118b81.jpg HTTP/1.1\r\nHost: img0.bdstatic.com\r\nAccept-Encoding: defalte\r\n\r\n");
int ret = connect(sockfd, (struct sockaddr *)&server_addr, sizeof( server_addr ) );
printf("connect res : %d\n", ret );
if( ret < 0 )
perror("connect error:");
send( sockfd, request, strlen( request ), 0 );
char buf[ 1024 ] = "";
int recv_len = 0;

recv_len = recv(sockfd, buf, sizeof( buf ), 0);
printf("buf --> %s\n",buf );
char *p = strstr( buf, "\r\n\r\n");
printf("\n\n---%d -- %d\n", recv_len , recv_len-(p+strlen("\r\n\r\n")-buf) );
int body_num =recv_len-(p+strlen("\r\n\r\n")-buf);
fwrite(p+strlen("\r\n\r\n"), body_num, 1, fp);
int sum = 0;
p = strstr( buf,"Content-Length:" );
if( p == NULL)
{
printf("--chunk---%s\n", buf);
exit( -1 );
}
int file_length = atoi( p+strlen("Content-Length: ") );
printf("---length : %d\n---", file_length);
file_length = file_length -body_num;
printf("---length : %d\n---", file_length);
do{
memset( buf, 0x00, sizeof(buf ));
recv_len = recv(sockfd, buf, sizeof( buf ), 0);
fwrite(buf ,recv_len ,1, fp );
sum += recv_len;
printf("----recv_len : %d sum : %d\n", recv_len, sum );
}while( sum < file_length );
fclose( fp );


}
Simple Down 简单下载系统6.2 更新内容及安装更新方法 1 修正上6.1版本首页标题不显示的问题 2 详情页面的关键词和内容摘要可自由填写。如果不填写则默认为标签加上系统设置里面的内容和标题加系统设置里面的内容。 3 修改服务器文件存放方式。文件将按照上传日期存放在根目录下的uploads文件夹下的 year/month/day 里面。 4 伪静态后缀自由选择。设置方式为:root/config/config.php 第60行: $config['url_suffix'] = '.html'; 这样的设置会生产 http://wen.hbdx.cc/view/1.html 这样的路径 $config['url_suffix'] = '.php'; 这样的设置会生产 http://wen.hbdx.cc/view/1.php 这样的路径 $config['url_suffix'] = ''; 这样的设置会生产 http://wen.hbdx.cc/view/1 这样的路径 5 搜索框的回车响应事件。输入关键字后回车即可搜索,与单击搜索按钮功能一样。 6 便签检索功能修改为单一检索方式。原来的方式是叠加。叠加的方式可以实现的功能是通过多个标签来定位资源。但是好像很多人不理解这种方式。 7 加入积分功能。在发布资源的时候可以设置下载此资源需要的积分。不设置默认为0。积分为0表示免费,游客可以直接下载免费资源。非免费得资源需要登录才可以下载下载时,下载者扣除积分,发布者增加积分。对应新注册的用户,会有一定的初始积分。初始积分有管理员在系统设置中设置。可有积分小于下载积分时不能下载。 8 详情页面加入百度分享插件。百度分享插件,大家可以去了解下,然后有什么好的建议可以提一下。 9 新增音乐试听功能。这个页面会读取所以后缀为mp3的记录。随机播放。播放器使用了HTML5的audio标签,所以不支持audio标签和不支持mp3格式的浏览器将无法使用。 10 新增个人中心功能。个人中心将展示用户最新发布的资源、最新收藏的资源、最近浏览的资源。最大展示条数为30。 11 新增浏览次数的统计。会和下载次数显示在一起。 12 新增下载记录统计。这个没有反应在前台。在积分功能中有使用到。已经下载过的资源再次下载不会再次扣除积分和增加积分。 13 重写注册模块的后台实现。   后续发展: 最近几个月我都在折腾Bootstrap(css框架),因为我想用Bootstrap重写Simple down的前台。 这期间用Bootstrap折腾了几个小程序,当做练手。现在基础的使用已经没有问题了。 下面的计划就是用Bootstrap重写前台。这样做的好处是可以做出更好看的UI,更标准化利于后续发展,兼容性更好,更重要的是为实现在其他终端上的完美显示。 这一次有人提出广告位的问题,我也考虑了一下。其实这个涉及到的工作主要是在前台,所以这一次暂时没有做,等到前台重写后会做的。 还有一个功能就是审核功能。我觉得这个功能很有必要。下个版本会加上。   附言: 另外我想说一下关于伪静态的问题。我对于这个也没有什么研究。 只知道不同的web服务器有不同的设置方法。完美常见的web服务器有Apache IIS Nginx等。 所以你要按照Simple down需要先把伪静态设置好。 Simple down基于CodeIgniter PHP框架,你们可以去CodeIgniter得论坛找一下。 有安装成功的同学请跟我分享一下这方面的经验,我好提供给其他遇到问题的人参考下。 我直接使用的Linux的VPS,安装的是LNMP的集成环境。在新建主机的时候直接选择了WordPress的伪静态规则就可以了。   请使用Simple Down建站,并且有一点数据库的站长和我联系。我可以在加你们链接。也方便其他新用户借鉴和学习。   Simple Down v6.2安装方法 注意:本程序需要伪静态的支持。   全新安装: 1 安装数据库。创建一个新的数据库,然后导入 dist/simple.sql 。 默认管理员账户:admin 密码:123456。 2 设置数据库信息。在 root/config/database.php 中: $db['default']['hostname'] = 'localhost'; //服务器地址 $db['default']['username'] = ''; //MYSQL 用户名 $db['default']['password'] = ''; //MYSQL 密码$db['default']
### 下载方法 - **VS Code**:可直接从[VS Code官网](https://code.visualstudio.com/)下载安装程序,运行安装程序并按提示完成安装即可 [^1]。 - **Typora**:从[Typora官网](https://typora.io/)下载对应系统的安装包,运行安装包完成安装。 - **Joplin**:可在其[官方网站](https://joplinapp.org/)选择适合Android、iOS、Desktop等不同平台的版本进行下载安装 [^1]。 - **MWeb(iOS)**:在iOS系统的App Store中搜索“MWeb”进行下载安装 [^1]。 - **Bear(iOS)**:在iOS系统的App Store中搜索“Bear”进行下载安装 [^1]。 - **MarkdownX(Android)**:在Android应用商店中搜索“MarkdownX”进行下载安装 [^1]。 - **StackEdit**:直接访问[stackedit.io](stackedit.io)即可使用,无需下载 [^1]。 - **Dillinger**:访问[dillinger.io](dillinger.io)在线使用,无需下载 [^1]。 - **HackMD**:访问[hackmd.io](hackmd.io)在线使用,无需下载 [^1]。 - **Markdown Live Preview**:访问[markdownlivepreview.com](markdownlivepreview.com)在线使用,无需下载 [^1]。 ### 使用方法 #### VS Code 安装好VS Code后,需安装Markdown相关插件。打开VS Code,点击左侧扩展图标,在搜索框中输入“Markdown”,选择合适的插件进行安装。安装完成后,打开一个 `.md` 文件即可开始使用Markdown语法进行编辑,可通过快捷键 `Ctrl + Shift + V`(Windows/Linux)或 `Cmd + Shift + V`(Mac)开启Markdown预览 [^1]。 #### 一般Markdown语法使用 下面是一个使用Markdown语法编写的简单示例: ```markdown # 我的Markdown文档 这是一个普通段落。 ## 列表 - 列表项1 - 列表项2 ### 有序列表 1. 第一项 2. 第二项 ## 链接和图片 [这是一个链接](https://www.example.com) ![图片](image.jpg) ## 代码块 ```python print("Hello, World!") ``` ``` 使用Markdown时,按照上述语法规则编写内容,不同的编辑器可能会有一些细微的显示差异,但基本语法通用 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值