庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>操作系统>Linux>编程开发>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

linux下的应用开发起步--简化蚂蚁制作(三)

 作者:本站收集   日期:2005-4-13
字号选择〖 〗/ 双击滚屏 单击停止   
linuxbird

C.前面看了一大段是不是有点云里雾里的啊?是有点罗嗦,但是俗话说:“万事
总是开头难”
OK,现在总算可以写主程序文件了。
下面就是ant.c文件

#include "ant.h"
#include "signal.h"
//0表示不用,1表示用代理
int use_proxy;
//代理服务器的地址
char proxy_server[100];
//端口
u_short proxy_port;

//蚂蚁数目
int ant_num;

//下载量
int bulk;
//下载进程
int progress;

char cfgfile[256];
char logfile[256];

struct Ant* ants[10];
struct Mission ms;
//响应异常退出,将url、ant数据结构中的变量值,存放到log文件。
void justpause()
{
int i;
FILE* log;
log=fopen(logfile,"w");
fprintf(log,"%s
",ms.url);
for(i=0;i
if( ants[i]->amount!=0)
fprintf(log, "%d:%d
",ants[i]->position,ants[i]->amount);
fclose(log);
exit(1);

}
//总算挨到主程序了,呵呵。。。。。
int main(int argc,char** argv)
{
int n;
int maxfd;
char savefile[256];
FILE* goods;
FILE* log;
fd_set rset,aset;
int finished;
int length;
char status[80];
char c;
struct sigaction sa;
//初始化环境参数
init_env( );


//对命令行传进来的参数做判断
while((c=getopt(argc,argv,"n:u:s:p:l:h"))!=EOF){
switch (c){
//取得蚂蚁数目
case 'n':
ant_num=atoi(optarg);
if(ant_num > MAXANTNUM)
ant_num = MAXANTNUM;
break;

//取得目标的url地址。
case 'u':
strcpy(ms.url, optarg);
break;

//取得代理的地址
case 's':
strcpy(proxy_server, optarg);
use_proxy=1;
break;

//取得代理的端口
case 'p':
use_proxy=1;
proxy_port=(u_short)atoi(optarg);
break;

//取得日志文件名
case 'l':
strcpy(logfile,optarg);
break;
case 'h':
printf("usage: ant -n antnum -u url -s proxyserver -p prxoy_port -l logfile
");
return 1;
}
}


//从日志文件中读取url
if(logfile[0] != 0){
log = fopen(logfile, "r+");
strcpy(ms.url,get_url_from_log(log));
}

//将值赋代理服务器的相关变量
if(use_proxy){
strcpy(ms.host,proxy_server);
ms.port=proxy_port;
}else{
strcpy(ms.host, extract_from_url(ms.url, SITENAME));
ms.port = atoi(extract_from_url(ms.url, PORTNAME));
}


//如果有下载日志,从日志中取相关信息
if(logfile[0] != 0){
printf("The file you havent download,continue.........
");
n=0;
strcpy(ms.url,get_url_from_log(log));
while (1) {
ants[n] = (struct Ant*)malloc(sizeof(struct Ant));
memset(ants[n], 0, sizeof(struct Ant));
if(!(assign_mission(log, ants[n])))
break;
n++;
if(n > MAXANTNUM){
printf("You logfile must be wrong!
");
exit(1);
}
}
fclose(log);
free(ants[n]);
ant_num=n;
}
else{
//取得下载文件的大小,为每只蚂蚁分配下载位置。
bulk=get_size_of_url(&ms);
if(bulk==0){
printf("Cannot get the size of this object!
");
ant_num=1;
ants[0] = (struct Ant*)malloc(sizeof(struct Ant));
ants[0]->position=0;
ants[0]->amount=1073741823;
}
else if(bulk==-1){
printf("Cannot connect to the site!
");
exit(1);
}
else{
for(n=0; n
ants[n] = (struct Ant*)malloc(sizeof(struct Ant));
ants[n]->position = (bulk/ant_num)*n;
if(n!=(ant_num-1))
ants[n]->amount = bulk/ant_num;
else
ants[n]->amount = bulk-(bulk/ant_num)*(ant_num-1);
}
}
}
//}

maxfd=0;

//重设&rset
FD_ZERO(&rset);

//下载,按蚂蚁数开线程
for(n=0; n
if(go(ants[n], &ms)){
enroll(ants[n], &rset);
maxfd=maxfd>ants[n]->s?maxfd:ants[n]->s;
}
}

if(!maxfd){
printf("no ant go work!
");
return 1;
}
memset(&sa,0,sizeof(struct sigaction));

//打开存储文件
strcpy(savefile, extract_from_url(ms.url, FILENAME));
if(!(goods=fopen(savefile, "r+"))){
if(!(goods=fopen(savefile,"w"))){
printf("Can not open file to save .
");
exit(1);
}
}
strcpy(logfile, savefile);
strcat(logfile, ".log");
//处理进程改变
sa.sa_handler=justpause;
sa.sa_flags=SA_ONESHOT;
sigaction(SIGINT, &sa, NULL);
maxfd++;

finished = 0;


progress = 0;
printf("

");
printf("Downloading ....................now!
");
while(1){
if(finished==ant_num){
break;
}
aset=rset;
select(maxfd,&aset,NULL,NULL,NULL);
for(n=0;n
if(FD_ISSET(ants[n]->s,&aset)){
if(!(length=receive(ants[n], goods))){
unenroll(ants[n], &rset);
finished++;
}
}
}
}


unlink(logfile);

log=(FILE*)NULL;

//打开日志文件
if(ant_num!=1){
for(n=0;n
if(ants[n]->amount){
if(!log){
log=fopen(logfile, "w+");
fputs(ms.url, log);
fputc('
',log);
}

//保存状态
save_status(ants[n], log);

printf("Ant %d have not done!%d
",n+1,ants[n]->amount);
}
else
printf("Ant %d done!
", n+1);

free(ants[n]);
}
}
else
free(ants[0]);

fclose(goods);
if(log)
fclose(log);

return 1;
}


D.写完程序下面就是做makefile.程序比较小,所以MAKEFILE也比较简单:
CC = gcc
CFLAGS =

source=ant.h ant.c funcs.c
object=ant.o funcs.o

ant:$(object)
$(CC) $(object) -o $@

%o:%c
$(CC) -c $< -o $@ $(CFLAGS)

bak:
tar czvf ant.tgz Makefile $(source)
rm -f $(object)

OK.到这总算飞到目的地了。现在你只要在命令行下用“make”命令就可以编译了。


4。教训
有一个错误,调了很久才发现,就是当fprintf(log,"%s
",ms.url)这样的语句
的指针变量为空时,程序执行过程中就会发生“Segmentation fault (core
dumped)”这样的错误。另外,由于程序没有多加判断,在输入url时,千万要
带上“http://”或“ftp://”,哪位网友有兴趣可以自己修改。
上一篇:linux下的应用开发起步--简化蚂蚁制作(二)    下一篇:Modules的概念及使用  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-4-13
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿