以文本方式查看主題 - 曙海教育集團論壇 (http://www.xinguifushi.cn/bbs/index.asp) -- Linux應用開發 (http://www.xinguifushi.cn/bbs/list.asp?boardid=32) ---- linux下的應用開發起步--簡化螞蟻制作(三) (http://www.xinguifushi.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); } } } /
|