动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.ORACLE入门之数据库安全策略.
.给 vi 初学者(1).
.在Oracle中使用自治事务保存日志.
.用PL/SQL产生随机数.
.SQL*PLUS常用命令列表.
.关于PUSH_SUBQ提示的说明.
.Oracle诊断案例----如何捕获问题.
.Linux 中 x86 的内联汇编.
.Oracle任命第十二个董事 Seligma.
.如何查找含特定字符串的文件.
.Oracle 分析函数的使用一.
.开机、关机与多重开机.
.Oracle数据库9i 关于审计(图).
.Oracle用“Cooking With Code”为.
.Oracle DBA 常用 Script 第二部分.
.双机容错方案.
.如何学习Oracle.
.关于触发器修改自身数据表实例.
.Oracle:10.0.1.2.0的bug!.
.Oracle10g中的current_scn是如何.

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

发表日期:2008-2-9 |



   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);
  }
  }
  }
  //}
  maxfd=0;
  //重设&rset
  FD_ZERO(&rset);
  //下载,按蚂蚁数开线程
  for(n=0; nants[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;ns,&aset)){
   if(!(length=receive(ants[n], goods))){
  unenroll(ants[n], &rset);
  finished++;
  }
  }
  }
  }
  unlink(logfile);
  log=(FILE*)NULL;
   //打开日志文件
  if(ant_num!=1){
   for(n=0;namount){
   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下的应用开发起步--简化蚂蚁制作(二) 人气:350
下一篇:Linux下的压缩/解压缩工具 人气:972
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵