写了个命令行的多线程下载工具mwget.

由本社区发起的开源项目
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

写了个命令行的多线程下载工具mwget.

#1

帖子 rgwan » 2011-08-18 15:51

全称:Multi line Wget,是myget的分支,支持多线程以及HTTPS,HTTP协议,正在不断完善中。

在sourceforge.MWGET工程,用的是kmphpfm的。原来的工程烂尾了,不好意思继续象SF要,就改了个名字。

网址:http://www.kmlinux.tk

https://sourceforge.net/projects/kmphpfm/files/

以及我提醒大家用rm和dd命令要小心。哎,我为了应付debian 的buildpackage复制了mwget两份,结果不小心都把里面的debian文件夹删掉了(多了个*),还好debian够意思,给我刘了mwget_0.1.0-kmbuild8.debian.tar.gz,要不然就玩玩了~
现在在SF上能下载到deb和源代码文件。大家试用下,可以吗
顺便说下,我的源代码树比较繁琐,Because 我不怎么会用autotools.
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 写了个命令行的多线程下载工具mwget.

#2

帖子 eexpress » 2011-08-18 15:53

有动态增加线程的没。
和axel比较下呢?
● 鸣学
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#3

帖子 rgwan » 2011-08-18 15:58

这个是多线程的,支持断点续传,大家帮忙测试下啊。
以及速度。
我上下我的测试成绩:
4M电信宽带。
MWget:
rgwan@rgwan-desktop:/usr/src$ mwget http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
开始下载:linux-3.0.3.tar.bz2
文件大小: 73M
22% [> > ==> ===> ] [ 16M] [474K/s] [ETA:02:01]
不小心Ctrl+C了(习惯性的复制)续传:
^Crgwan@rgwan-desktop:/usr/src$ mwget http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
开始下载:linux-3.0.3.tar.bz2
文件大小: 73M
56% [====> ====> =====> ========> ] [ 41M] [461K/s] [ETA:01:11]
好像wget不支持断点续传的诶。
rgwan@rgwan-desktop:/usr/src$ mwget http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
开始下载:linux-3.0.3.tar.bz2
文件大小: 73M
100% [=============================================] [ 73M] [323K/s] [ETA:00:00]下载成功,用了 01:14 (分钟:秒).
后面的翻译太……了。我用英文写程序的。
Wget:
rgwan@rgwan-desktop:/usr/src$ wget http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
--2011-08-18 15:56:55-- http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
正在解析主机 www.kernel.org... 149.20.4.69, 149.20.20.133, 2001:4f8:8:10:1994:313:1:0, ...
正在连接 www.kernel.org|149.20.4.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 76757425 (73M) [application/x-bzip2]
正在保存至: “linux-3.0.3.tar.bz2”

9% [==> ] 7,008,712 433K/s 估时 2m 55s ^C
好像速度也差不多,测试断点续传
rgwan@rgwan-desktop:/usr/src$ wget http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
--2011-08-18 15:57:36-- http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
正在解析主机 www.kernel.org... 149.20.4.69, 149.20.20.133, 2001:4f8:8:10:1994:313:1:0, ...
正在连接 www.kernel.org|149.20.4.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 76757425 (73M) [application/x-bzip2]
正在保存至: “linux-3.0.3.tar.bz2.1”
狂汗。前功尽弃~
算了,不继续测试了
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#4

帖子 rgwan » 2011-08-18 15:59

eexpress 写了:有动态增加线程的没。
和axel比较下呢?
没有。但是在启动的时候可以设定。
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#5

帖子 rgwan » 2011-08-18 15:59

下个版本增加限速和动态线程吧。现在我没时间弄
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#6

帖子 rgwan » 2011-08-18 16:00

顺便说下。你抢搂速度太快了~
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 写了个命令行的多线程下载工具mwget.

#7

帖子 eexpress » 2011-08-18 16:03

以前,我改axel。增加了一个历史记录的log。就是没下载完成的,自动恢复。省得输入长长的url。
你也加一个吧。
● 鸣学
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#8

帖子 rgwan » 2011-08-18 16:05

和axel的速度差不多,mwget平均420K,axel平均421K,峰值mwget稍微高点,只搞了2K,谷值axel高。
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#9

帖子 rgwan » 2011-08-18 16:05

但是axel疯狂刷屏实在是吃不消~
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
373992900
帖子: 4202
注册时间: 2010-06-14 13:37

Re: 写了个命令行的多线程下载工具mwget.

#10

帖子 373992900 » 2011-08-18 16:36

支持个
头像
qiang_liu8183
论坛版主
帖子: 10699
注册时间: 2006-09-10 22:36
系统: Arch Debian
来自: 北京

Re: 写了个命令行的多线程下载工具mwget.

#11

帖子 qiang_liu8183 » 2011-08-18 18:09

支持一下
看破、放下、自在、随缘、念佛
真诚、清净、平等、正觉、慈悲
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11

Re: 写了个命令行的多线程下载工具mwget.

#12

帖子 yjcong » 2011-08-18 18:15

声援下
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#13

帖子 rgwan » 2011-08-18 20:32

正在支持日志记录。
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
头像
phoenixlzx
帖子: 2245
注册时间: 2009-07-29 20:11
系统: Arch Linux
来自: Gensokyo
联系:

Re: 写了个命令行的多线程下载工具mwget.

#14

帖子 phoenixlzx » 2011-08-18 21:06

:em11 :em11 :em11
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 写了个命令行的多线程下载工具mwget.

#15

帖子 rgwan » 2011-08-19 13:56

/* MWget - A Multi download for all POSIX systems.
* Homepage: http://mwget.sf.net
* Copyright (C) 2005- rgwan,xiaosuo
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/

#include <iostream>
#include <stdio.h>
#include "i18n.h"
#include <stdlib.h> //getenv要用。
#include <string.h> //strcat
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h> //stat
#include <limits.h>
#define FAIL_RECORD_SAVE_FILE "/.mwget-history" //文件名,在~下,要加/
#define LINE 1024
#define echo(String) printf("%s\n",String)
#define MAX_ITEM 25
char fail_record_url[MAX_ITEM+3][LINE];//URL
//char **fail_record_file;//文件位置
char fail_record_file[MAX_ITEM+3][LINE];
//最大25组。防备溢出
char isdata=0;
unsigned char izdata=0;//行数
//Y长度最大1024个,X长度最大50组。
//遵循FIFO
char *CR="\r";
char *LF="\n";
char fail_record_ignore=0;//跳过
char fail_record_allno=0;//取消

//Sorry啊,水平……只会C.和PHP.就不用C++写法了……
//这里不是51单片机,就放开了写吧,反正内存很大。
//把生成临时文件的代码抄过来
//想法是开始将URL和本地的路径保存到文件里
//然后下完了注销
//至于当时下载的环境嘛……就不去复原了。
//函数: str_replace
//功能: 将字符串s中所有f的内容替换成r的内容
//返回: 新字符串的地址(使用free释放), 失败返回0。
//Usage:后字符串=str_replace(原字符串, 需要替换的内容, 替换的内容);
//现在我发现程序写的越来越乱了
static char* substr(const char*str, unsigned start, unsigned end)
{
unsigned n = end - start;
static char stbuf[256];
strncpy(stbuf, str + start, n);
stbuf[n] = 0;
return stbuf;
}


char *replace(char *source, char *sub, char *rep)
{
char *result;
/*pc1 是复制到结果result的扫描指针*/
/*pc2 是扫描 source 的辅助指针*/
/*pc3 寻找子串时,为检查变化中的source是否与子串相等,是指向sub的扫描指针 */
/*找到匹配后,为了复制到结果串,是指向rep的扫描指针*/
char *pc1, *pc2, *pc3;
int isource, isub, irep;
isub = strlen(sub); /*对比字符串的长度*/
irep = strlen(rep); /*替换字符串的长度*/
isource= strlen(source); /*源字符串的长度*/
if(NULL == *sub)
return strdup(source);

/*申请结果串需要的空间*/
result = (char *)malloc(( (irep > isub) ? (float)strlen(source) / isub* irep+ 1:isource ) * sizeof(char));
pc1 = result; /*为pc1依次复制结果串的每个字节作准备*/
while(*source != NULL)
{
/*为检查source与sub是否相等作准备,为pc2,pc3 赋初值*/
pc2 = source;
pc3 = sub;
/* 出循环的(任一)条件是:
* *pc2 不等于 *pc3 (与子串不相等)
* pc2 到源串结尾
* pc3 到源串结尾 (此时,检查了全部子串,source处与sub相等)
*****************************************************/
while(*pc2 == *pc3 && *pc3 != NULL && *pc2 != NULL)
pc2++, pc3++;
/* 如果找到了子串,进行以下处理工作*/
if(NULL == *pc3)
{
pc3 = rep;
/*将替代串追加到结果串*/
while(*pc3 != NULL)
*pc1++ = *pc3++;
pc2--;
source = pc2;
/* 检查 source与sub相等的循环结束后,
* pc2 对应的位置是在 sub 中串结束符处。该是源串中下一个位置。
* 将 source 指向其前面一个字符。
***************************************************/
}
else /*如果没找到子串,下面复制source所指的字节到结果串*/
*pc1++ = *source;

source++; /* 将source向后移一个字符*/
}
*pc1 = NULL;
return result;

}
int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
{
int StringLen;
char caNewString[64];
char* FindPos;
FindPos =(char *)strstr(sSrc, sMatchStr);
if( (!FindPos) || (!sMatchStr) )
return -1;

while( FindPos )
{
memset(caNewString, 0, sizeof(caNewString));
StringLen = FindPos - sSrc;
strncpy(caNewString, sSrc, StringLen);
strcat(caNewString, sReplaceStr);
strcat(caNewString, FindPos + strlen(sMatchStr));
strcpy(sSrc, caNewString);

FindPos =(char *)strstr(sSrc, sMatchStr);
}
free(FindPos);
return 0;
}
char *get_History_File_Name()
{
return strcat(getenv("HOME"),FAIL_RECORD_SAVE_FILE);
}
char *ReadData(FILE *fp, char *buf)
{
//char *temp;
char *i;
i = fgets(buf, LINE, fp);//读取一行到buf
//buf=str_replace(buf,"\r","");//替换掉回车换行。
//buf=str_replace(buf,"\n","");

return i;
}

void add_line(char *buf)//存入数组函数
{//ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
char *tempbuff;
tempbuff=buf;
//echo("5SB");
ReplaceStr(tempbuff,CR,"");
//echo("7SB");
ReplaceStr(tempbuff,LF,"");
//echo("6SB");
if (isdata==0)
{
isdata=1;
//strcpy(fail_record_url[izdata],buf);
sprintf(fail_record_url[izdata],"%s",tempbuff);
//printf("DEBUG\n");
printf("fail_record_url[%i]=%s\n",izdata,fail_record_url[izdata]);//fail_record_url[izdata]);

}
else
{
isdata=0;
//strcpy(fail_record_file[izdata],buf);//=buf;//这里的操作你自己定义
sprintf(fail_record_file[izdata],"%s",tempbuff);
//printf("DEBUG1\n");
printf("fail_record_file[%i]=%s\n",izdata,fail_record_file[izdata]);//fail_record_file[izdata]);
izdata++;
}



}
char fail_record_touch(char *filename)//创建空文件
{
FILE *fd;
if ((fd=fopen(filename, "w"))==NULL)
{
//echo("fclose(fp)");
return 0;//没用
}
{
echo("fclose(fp)");
fclose(fd);
return 1;//成功
}
}
char *get_abs_path(char *path)
{
char currentDir[PATH_MAX];
char *temp;
char *temp2;
char abs;

#ifdef WIN32 //还要兼容M$
temp=substr(path,1,2);
if (strcmp(temp,":")==0)
{abs=1;}
else
{abs=0;}
#endif
#ifndef WIN32 //兼容Linux的代码,绝对路径的第一个字符是'/'
temp=substr(path,0,1);
if (strcmp(temp,"/")==0)
{abs=1;}
else
{abs=0;}
#endif
if(abs==1)
{//是绝对路径
return path;
}else
{//不是绝对路径
if( getcwd( currentDir, sizeof(currentDir)-1 ) != NULL )
{//substr(const char*str, unsigned start, unsigned end)
if (strcmp(path,".")==0)
{temp2="";}
else
{temp2=path;}
#ifdef WIN32
temp= strcat(currentDir,"\\");
#endif
#ifndef WIN32
temp= strcat(currentDir,"/");
#endif
temp = strcat(temp,temp2);
temp = replace(temp,"//","/");
#ifdef WIN32
temp = replace(temp,"\\\\","\\");
#endif
return temp;
}
else
{
return 0;//返回错误
}
}
}



char fail_record_readrecord()//这个是读文件的函数
{
izdata=0;//初始化指针。
/*
char *realfilename;
realfilename=strcat(getenv("HOME"),FAIL_RECORD_SAVE_FILE);
fd = fopen(realfilename, "r"); //开文件,只读。
if(fd == NULL){
cerr<<_("Can not access the cache file: ")<<realfilename<<_(" ,Ignore.")<<endl;
return -1;
}
*/
FILE *fp;
char *buf, *p;
char *realfilename;
printf("$HOME=%s\n",getenv("HOME"));
realfilename=get_History_File_Name();
printf("$FILENAME=%s\n",realfilename);
echo("fclose(fp)A");
fp=fopen(realfilename, "r");
echo("fclose(fp)1");
if (fp==NULL)
{
echo("NULL");
return 0;
}
else
{
//echo("SB");
buf=(char*)malloc(LINE*sizeof(char));

while(1) {
//echo ("2SB");
p=ReadData(fp, buf);//每次调用文件指针fp会自动后移一行
//echo ("3SB");
if(!p)//文件读取结束则跳出循环
break;
//echo ("4SB");
add_line(buf);
}
echo("fclose(fp)");
fclose(fp);
return 1;
}
/*
//printf("%s\n",_("Can not open cache file to read."));
if (fail_record_touch(realfilename)!=0)
{//新建文件成功

//fclose(fp);
return 1;
}
*/
// else
//{
//echo("fclose(fp)2");
//fclose(fp);
// return 0;//返回失败码
// }
//}
/*
//printf("%s\n",replace("aabbccdd\n\n","",""));
buf=(char*)malloc(LINE*sizeof(char));

while(1) {
p=ReadData(fp, buf);//每次调用文件指针fp会自动后移一行
if(!p)//文件读取结束则跳出循环
break;
add_line(buf);
}
echo("fclose(fp)");
fclose(fp);
return 1;
*/
}
char fail_record_saverecord()//写文件函数
{
unsigned char i=0;
FILE *fv;
char *temp;
char *rfn;
char j;
j=(izdata+1);
rfn=getenv("HOME"); //这里我相当奇怪。
//如果写strcat(getenv("HOME"),FAIL_RECORD_SAVE_FILE)
//返回就是$HOME/.mwget-history/.mwget-history
//真的相当奇怪。
//memset(rfn,0,sizeof(rfn));
//memset(rfn,0,sizeof(rfn));
//echo(FAIL_RECORD_SAVE_FILE);
echo(rfn);
fv=fopen(rfn, "w+");
printf("izdata=%i\n",izdata);
//printf("%i",fail_record_touch(rfn));
//fwrite("dummy",strlen("dummy"),1,fv);
if (fv==NULL)
{
printf("No\n");
//fclose(fp);
return 0;//不成功
}
else
{
while(i!=j)//循环直到数组结束
{
printf("i=%i,j=%i",i,j);
if (strcmp(fail_record_url,"")==0) //如果这个数的值为“”的话
{//神马都不做
echo("There");
}
else
{
echo("Here");
temp=strcat(fail_record_url,LF);//先写URL,后写FILE。和读取顺序对准。后面加个LF来换行
fwrite(temp,strlen(temp),1,fv);
temp=strcat(fail_record_file,LF);
fwrite(temp,strlen(temp),1,fv);
}
i++;
}
fclose(fv);
return 1;
}
}
void fail_record_unset_by_url()//这个是解注册函数
{

}
char fail_record_unset_by_id(unsigned char id)//这个是解注册函数
{
//这个相当简单,删掉ID值指向的数组,然后写盘。
char temp=0;
if (fail_record_readrecord()==0)
{
return 0;
}
else
{
if (id>=(MAX_ITEM+1))
{
return 0;
}
else
{
sprintf(fail_record_url[id],"%s","");
sprintf(fail_record_file[id],"%s","");
if (fail_record_saverecord()==0)//写盘
{//不成功
return 0;
}
else
{

if (fail_record_readrecord()==0)
{
return 0;
}
else
{
return 1;
}//重载

}
}
}

}

void fail_record_registry(char *filename,const char *url)
{
char *filetemp;
unsigned char temp;
filetemp=get_abs_path(filename); //标记绝对文件名
printf("FILETEMP=%s,FILEURL=%s\n",filename,url);
printf("OK=%i",fail_record_readrecord()); //读入原来的数据
if (filetemp==0)
{//有问题了。
}
else
{
temp=izdata+1;
if (izdata>=(MAX_ITEM+1))
{//超限
fail_record_unset_by_id(0);//FIFO,把原来的烂帐删掉。
temp=izdata+1;//这下就可以插入了
sprintf(fail_record_file[temp],"%s",filetemp);
sprintf(fail_record_url[temp],"%s",url);
}
else
{//直接插
sprintf(fail_record_file[temp],"%s",filetemp);
sprintf(fail_record_url[temp],"%s",url);
}
}
izdata++;
printf("\nOK=%i\n",fail_record_saverecord());
}
/*
void fail_record_registry_url(char *url)
{
char *filetemp;
unsigned char temp;
filetemp=get_abs_path(filename); //标记绝对文件名
if (filetemp==0)
{//有问题了。
}
else
{
temp=izdata+1;
if (izdata>=(MAX_ITEM+1))
{//超限
fail_record_unset_by_id(0);//FIFO,把原来的烂帐删掉。
temp=izdata+1;//这下就可以插入了
sprintf(fail_record_url[temp],"%s",url);
}
else
{//直接插
sprintf(fail_record_url[temp],"%s",url);
}
}
}
*/

void fail_record_check()//检查是否有没有完成的下载。
{

}
这个代码相当奇怪。具体请看我说奇怪的注释~
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
回复