以文本方式查看主题 - 曙海教育集团论坛 (http://peixun0.cn/bbs/index.asp) -- Linux应用开发 (http://peixun0.cn/bbs/list.asp?boardid=32) ---- linux下的应用开发起步--简化蚂蚁制作(三) (http://peixun0.cn/bbs/dispbbs.asp?boardid=32&id=1660) |
-- 作者:wangxinxin -- 发布时间:2010-11-23 10:29:54 -- linux下的应用开发起步--简化蚂蚁制作(三) 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;iamount!=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; nposition = (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); } } } /
|