📄 307.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="301.htm">上一层</a>][<a href="308.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>
标 题: linux下面的应用开发起步--小小的网络蚂蚁(三)(转载) <br>
发信站: UNIX编程 (2001年08月28日18:36:34 星期二), 站内信件 <br>
<br>
【 以下文字转载自 APUE 讨论区 】 <br>
【 原文由 chillone 所发表 】 <br>
<br>
linux下的应用开发起步--简化蚂蚁制作(三) <br>
原创 01-03-17 11:27 175p linuxbird <br>
---------------------------------------------------------------------------- <br>
---- <br>
C.前面看了一大段是不是有点云里雾里的啊?是有点罗嗦,但是俗话说:“万事 <br>
总是开头难” <br>
OK,现在总算可以写主程序文件了。 <br>
下面就是ant.c文件 <br>
#include "ant.h" <br>
#include "signal.h" <br>
//0表示不用,1表示用代理 <br>
int use_proxy; <br>
//代理服务器的地址 <br>
char proxy_server[100]; <br>
//端口 <br>
u_short proxy_port; <br>
//蚂蚁数目 <br>
int ant_num; <br>
//下载量 <br>
int bulk; <br>
//下载进程 <br>
int progress; <br>
char cfgfile[256]; <br>
char logfile[256]; <br>
struct Ant* ants[10]; <br>
struct Mission ms; <br>
//响应异常退出,将url、ant数据结构中的变量值,存放到log文件。 <br>
void justpause() <br>
{ <br>
int i; <br>
FILE* log; <br>
log=fopen(logfile,"w"); <br>
fprintf(log,"%s ",ms.url); <br>
for(i=0;i<ant_num;i++) <br>
if( ants[i]->amount!=0) <br>
fprintf(log, "%d:%d ",ants[i]->position,ants[i]->amount); <br>
fclose(log); <br>
exit(1); <br>
exit(1); <br>
} <br>
//总算挨到主程序了,呵呵。。。。。 <br>
int main(int argc,char** argv) <br>
{ <br>
int n; <br>
int maxfd; <br>
char savefile[256]; <br>
FILE* goods; <br>
FILE* log; <br>
fd_set rset,aset; <br>
int finished; <br>
int length; <br>
char status[80]; <br>
char c; <br>
struct sigaction sa; <br>
//初始化环境参数 <br>
init_env( ); <br>
//对命令行传进来的参数做判断 <br>
while((c=getopt(argc,argv,"n:u:s:p:l:h"))!=EOF){ <br>
switch (c){ <br>
//取得蚂蚁数目 <br>
case 'n': <br>
case 'n': <br>
ant_num=atoi(optarg); <br>
if(ant_num > MAXANTNUM) <br>
ant_num = MAXANTNUM; <br>
break; <br>
//取得目标的url地址。 <br>
case 'u': <br>
strcpy(ms.url, optarg); <br>
break; <br>
//取得代理的地址 <br>
case 's': <br>
strcpy(proxy_server, optarg); <br>
use_proxy=1; <br>
break; <br>
//取得代理的端口 <br>
case 'p': <br>
use_proxy=1; <br>
proxy_port=(u_short)atoi(optarg); <br>
break; <br>
//取得日志文件名 <br>
case 'l': <br>
strcpy(logfile,optarg); <br>
break; <br>
break; <br>
case 'h': <br>
printf("usage: ant -n antnum -u url -s proxyserver -p prxoy_port -l logfile <br>
"); <br>
return 1; <br>
} <br>
} <br>
//从日志文件中读取url <br>
if(logfile[0] != 0){ <br>
log = fopen(logfile, "r+"); <br>
strcpy(ms.url,get_url_from_log(log)); <br>
} <br>
//将值赋代理服务器的相关变量 <br>
if(use_proxy){ <br>
strcpy(ms.host,proxy_server); <br>
ms.port=proxy_port; <br>
}else{ <br>
strcpy(ms.host, extract_from_url(ms.url, SITENAME)); <br>
ms.port = atoi(extract_from_url(ms.url, PORTNAME)); <br>
} <br>
//如果有下载日志,从日志中取相关信息 <br>
if(logfile[0] != 0){ <br>
printf("The file you havent download,continue......... "); <br>
n=0; <br>
strcpy(ms.url,get_url_from_log(log)); <br>
while (1) { <br>
ants[n] = (struct Ant*)malloc(sizeof(struct Ant)); <br>
memset(ants[n], 0, sizeof(struct Ant)); <br>
if(!(assign_mission(log, ants[n]))) <br>
break; <br>
n++; <br>
if(n > MAXANTNUM){ <br>
printf("You logfile must be wrong! "); <br>
exit(1); <br>
} <br>
} <br>
fclose(log); <br>
free(ants[n]); <br>
ant_num=n; <br>
} <br>
else{ <br>
//取得下载文件的大小,为每只蚂蚁分配下载位置。 <br>
bulk=get_size_of_url(&ms); <br>
if(bulk==0){ <br>
printf("Cannot get the size of this object! "); <br>
ant_num=1; <br>
ants[0] = (struct Ant*)malloc(sizeof(struct Ant)); <br>
ants[0]->position=0; <br>
ants[0]->amount=1073741823; <br>
} <br>
else if(bulk==-1){ <br>
printf("Cannot connect to the site! "); <br>
exit(1); <br>
} <br>
else{ <br>
for(n=0; n<ant_num; n++){ <br>
ants[n] = (struct Ant*)malloc(sizeof(struct Ant)); <br>
ants[n]->position = (bulk/ant_num)*n; <br>
if(n!=(ant_num-1)) <br>
ants[n]->amount = bulk/ant_num; <br>
else <br>
ants[n]->amount = bulk-(bulk/ant_num)*(ant_num-1); <br>
} <br>
} <br>
} <br>
//} <br>
maxfd=0; <br>
maxfd=0; <br>
//重设&rset <br>
FD_ZERO(&rset); <br>
//下载,按蚂蚁数开线程 <br>
for(n=0; n<ant_num; n++){ <br>
if(go(ants[n], &ms)){ <br>
enroll(ants[n], &rset); <br>
maxfd=maxfd>ants[n]->s?maxfd:ants[n]->s; <br>
} <br>
} <br>
if(!maxfd){ <br>
printf("no ant go work! "); <br>
return 1; <br>
} <br>
memset(&sa,0,sizeof(struct sigaction)); <br>
//打开存储文件 <br>
strcpy(savefile, extract_from_url(ms.url, FILENAME)); <br>
if(!(goods=fopen(savefile, "r+"))){ <br>
if(!(goods=fopen(savefile,"w"))){ <br>
printf("Can not open file to save . "); <br>
exit(1); <br>
} <br>
} <br>
} <br>
strcpy(logfile, savefile); <br>
strcat(logfile, ".log"); <br>
//处理进程改变 <br>
sa.sa_handler=justpause; <br>
sa.sa_flags=SA_ONESHOT; <br>
sigaction(SIGINT, &sa, NULL); <br>
maxfd++; <br>
finished = 0; <br>
progress = 0; <br>
printf(" "); <br>
printf("Downloading ....................now! "); <br>
while(1){ <br>
if(finished==ant_num){ <br>
break; <br>
} <br>
aset=rset; <br>
select(maxfd,&aset,NULL,NULL,NULL); <br>
for(n=0;n<ant_num;n++){ <br>
if(FD_ISSET(ants[n]->s,&aset)){ <br>
if(!(length=receive(ants[n], goods))){ <br>
unenroll(ants[n], &rset); <br>
finished++; <br>
finished++; <br>
} <br>
} <br>
} <br>
} <br>
unlink(logfile); <br>
log=(FILE*)NULL; <br>
//打开日志文件 <br>
if(ant_num!=1){ <br>
for(n=0;n<ant_num;n++){ <br>
if(ants[n]->amount){ <br>
if(!log){ <br>
log=fopen(logfile, "w+"); <br>
fputs(ms.url, log); <br>
fputc(' ',log); <br>
} <br>
//保存状态 <br>
save_status(ants[n], log); <br>
printf("Ant %d have not done!%d ",n+1,ants[n]->amount); <br>
} <br>
else <br>
printf("Ant %d done! ", n+1); <br>
free(ants[n]); <br>
free(ants[n]); <br>
} <br>
} <br>
else <br>
free(ants[0]); <br>
fclose(goods); <br>
if(log) <br>
fclose(log); <br>
return 1; <br>
} <br>
D.写完程序下面就是做makefile.程序比较小,所以MAKEFILE也比较简单: <br>
CC = gcc <br>
CFLAGS = <br>
source=ant.h ant.c funcs.c <br>
object=ant.o funcs.o <br>
ant:$(object) <br>
$(CC) $(object) -o $@ <br>
%o:%c <br>
$(CC) -c $< -o $@ $(CFLAGS) <br>
bak: <br>
tar czvf ant.tgz Makefile $(source) <br>
rm -f $(object) <br>
OK.到这总算飞到目的地了。现在你只要在命令行下用“make”命令就可以编译了。 <br>
4。教训 <br>
有一个错误,调了很久才发现,就是当fprintf(log,"%s ",ms.url)这样的语句 <br>
的指针变量为空时,程序执行过程中就会发生“Segmentation fault (core <br>
dumped)”这样的错误。另外,由于程序没有多加判断,在输入url时,千万要 <br>
带上“http://”或“ftp://”,哪位网友有兴趣可以自己修改。 <br>
char), length, save)){ <br>
ant->amount-=length; <br>
ant->position+=length; <br>
return length; <br>
} <br>
} <br>
return 0; <br>
} <br>
int <br>
//保存当前的蚂蚁数目,以及状态 <br>
save_status(struct Ant* ant, FILE* log) <br>
{ <br>
return fprintf(log,"%d:%d ",ant->position,ant->amount); <br>
} <br>
<br>
-- <br>
一头栽倒luckylucky的怀里 <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61] -- <br>
※ 转载:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.225] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="301.htm">上一层</a>][<a href="308.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -