⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 307.htm

📁 unix高级编程原吗
💻 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 + -