国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

linux下的應用開發起步--簡化螞蟻制作(二)

2024-07-21 02:37:28
字體:
來源:轉載
供稿:網友

  3.ok,在初步了解完這些系統調用后,我們就可以開始干活了。
  
    A.開始定義頭文件了。
  
  #ifndef __ANT_H
  #define __ANT_H
  //定義包含庫
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  //定義螞蟻的最大數目
  #define MAXANTNUM 6
  //定義緩存大小
  #define BUFSIZE 1500
  //從傳進來的長字符串分別揀開文件名、域名、路徑、端口等
  #define FILENAME 1
  #define SITENAME 2
  #define PATHNAME 3
  #define PORTNAME 4
  typedef char URL[256];
  //定義螞蟻的數據結構
  strUCt Ant{
  int s;
  // URL mission;
  int position;
  int amount;
  char haversack[BUFSIZE];
  int ready;
  };
  //定義任務的數據結構
  struct Mission{
  char host[100];
  u_short port;
  URL url;
  };
  //是否用代理 0表示不用,1表示用
  extern int use_PRoxy;
  //代理地址
  extern char proxy_server[100];
  //代理端口
  extern u_short proxy_port;
  //螞蟻數目
  extern int ant_num;
  extern int bulk;
  //下載進度
  extern int progress;
  //配置文件
  extern char cfgfile[256];
  //日志文件
  extern char logfile[256];
  extern struct Ant* ants[10];
  extern struct Mission ms;
  //此函數是讀取配置文件的
  extern void read_cfg(char* file);
  //此函數是初始化環境的,給變量賦值
  extern void init_env();
  //分配下載任務
  extern int assign_mission(FILE* log, struct Ant* ant);
  //此函數是去掉字符串的空格
  extern void eat_whitespace(char* str);
  //
  extern char* extract_from_url(URL url,int what);
  //從日志文件中取得地址
  extern char* get_url_from_log(FILE* log);
  //返回下載文件的大小
  extern int get_size_of_url(struct Mission* pms);
  //go......下載文件
  extern int go(struct Ant* ant, struct Mission* pms);
  extern void enroll(struct Ant* ant, fd_set* rset);
  extern void unenroll(struct Ant* ant,fd_set* rset);
  extern int receive(struct Ant* ant, FILE* save);
  //假如意外退出,保存當前狀態
  extern int save_status(struct Ant* ant, FILE* log);
  #endif
  
    B.在定義完頭文件后,下面就可以寫輔助函數了,主要是圍繞著讀取配置、創建連接、下載文件、保存文件、保存當前螞蟻狀態等。

  
    下面就是funcs.c源碼內容
  
  #include "ant.h"
  //讀取配置文件,并賦予相關變量的值
  void
  read_cfg(char* cfgfile)
  {
  FILE* f;
  int i;
  char line[256];
  char* p=(char*)NULL;
  //判定是否能打開該文件
  if((f = fopen(cfgfile, "r")) == (FILE*)NULL){
  printf("can not open cfg file ");
  exit(1);
  }
  while(fgets(line, 256, f)!=(char*)NULL){
  eat_whitespace(line);//去掉空行(此喂自定義函數)
  if(line[0]=='#')
  continue;
  for(i = 0; line[i]; i++)
  line[i]=tolower(line[i]);
  //將所有字母轉換成小寫的
  if((p = strstr(line,"use_proxy"))){
  //查找代理(proxy)開關設置信息,有則給use_proxy=1,否則為0
  if(strstr(line,"yes"))
  use_proxy=1;
  else
  use_proxy=0;
  }
  else if((p = strstr(line,"proxy_server"))){
  //查找代理服務器地址設置信息,將值賦給(proxy_server)
  p=strstr(line,"=");
  eat_whitespace(++p);
  strcpy(proxy_server, p);
  }
  else if((p = strstr(line, "proxy_port"))){
  //查找代理端口設置信息,將值賦給(proxy_port)
  p=strstr(line, "=");
  eat_whitespace(++p);
  proxy_port=atoi(p);
  }
  }
  }
  void
  //初始化環境參數,將值賦給各個變量
  init_env( )
  {
   strcpy(cfgfile, "./ant.conf");
   //取得配置文件名
   read_cfg(cfgfile);
   //取得配置文件中的變量
  logfile[0] = cfgfile[0] = 0;
  ant_num = MAXANTNUM;
  bulk = 0; progress=0;
  }
  char*
  //從記錄文件里取得URL地址,斷點續傳的時候用,函數返回url
  get_url_from_log(FILE* log)
  {
  static URL url;
  URL line;
   fseek(log, 0, SEEK_SET);
   //從文件中讀取字符串,從起始字符為"#"的行取url
  while(fgets(line, sizeof(line)-1, log)!=(char*)NULL){
  eat_whitespace(line);
  if(line[0]=='#')
  continue;
  strcpy(url, line);
  return url;
  }
  memset(url,0,sizeof(url));
  //內存中為之分配地址
  return url;
  }
  int
  //分配下載任務,失敗返回0,從上面函數返回的字符中分析出將相關的值賦給數據結構ant
  assign_mission(FILE* log, struct Ant* ant)
  {
  char line[256];
  char* p;
  while(fgets(line, 256, log)!=(char*)NULL){
  eat_whitespace(line);
  if((line[0]=='#')toupper(line[0]=='H')toupper(line[0]=='F'))
  continue;
  if(isdigit(line[0])){
  ant->position=atoi(line);
  p=index(line,':');
  ant->amount=atoi(++p);
  return 1;
  }else
  continue;
  }
  return 0;
  }
  void
  //去掉字符流中的空行
  eat_whitespace(char* str)
  {
   char* p;
   int i;
   p=str;
   for(i=0; isspace(p[i]); i++ );
   for( ;*p ;p++)
   *p=p[i];
   p=str;
   for(i=strlen(str)-1;isspace(p[i]);i--)
   p[i]=0;
  }
  char*
  //從傳進來的url字符串中,分析出文件名、域名、端口名、路徑,
  根據不同的what返回不同的字串。
  extract_from_url(URL url,int what)
  {
  static char res[100];
  char* p;
  char* pn;
  res[0]=0;
  memset(res,0,100);
  switch (what){
  case FILENAME://分析文件名、若沒有用index.Html替代(網絡默認的首頁,呵呵)
  p=rindex(url,'/');
  if((*(p-1)=='/')(*(p+1)==0))
  strcpy(res,"index.html");
  else
  strcpy(res,++p);
  break;
  case PATHNAME:
  break;
  case SITENAME: //分析出域名,其中,對FTP,和http做出分類
  if((p=index(url, '@')))
   p++;
  else{
  if((p=strstr(url,"http://")))
  p+=7;
  else if((p=strstr(url,"ftp://")))
  p+=6;
  else
  p=url;
  }
  if((pn=index(p,':'))(pn=index(p,'/'))){
  strncpy(res,p,pn-p);
  res[pn-p] = 0;
  }
  else
  strcpy(res,p);
  break;
  case PORTNAME: //在字符"www.XXXX.com:8080/"之間取得端口號
  if((p=rindex(url,':'))&&(*(++p)!='/')){
  if((pn=index(p,'/'))){
  strncpy(res,p,pn-p);
  res[pn-p]=0;
  }
  else
  strcpy(res,p);
  }
  else{
  strcpy(res,"80");
  }
  break;
  }
  return res;
  }
  //
  int
  //根據傳進來的Mission數據結構,建立socket鏈接,取得文件的大小。

  get_size_of_url(struct Mission* pms)
  {
  int s;
  struct sockaddr_in sin;
  struct hostent* phe;
  char cmd[256];
  char msg_hdr[1000];
  char* p;
   //預備http中GET 方法的請求。
  sprintf(cmd,"GET %s HTTP/1.0 ", pms->url);
   //創建socket
  if((s=socket(PF_INET,SOCK_STREAM,0))<0)
  return -1;
   //取得遠程主機的ip地址,失敗函數返回-1
  if((phe = gethostbyname(pms->host)) == NULL)
  return -1;
  memset(&sin,0,sizeof(sin));
  memcpy(&sin.sin_addr,phe->h_addr,sizeof(struct in_addr));
  sin.sin_fa

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡县| 宁城县| 兴和县| 林口县| 榆树市| 青龙| 香格里拉县| 石楼县| 仙居县| 修武县| 阜康市| 阜宁县| 青河县| 色达县| 平江县| 临颍县| 浮山县| 乐亭县| 阿瓦提县| 吴忠市| 兖州市| 景洪市| 晋江市| 邯郸市| 祁门县| 宿松县| 扎兰屯市| 和平县| 青河县| 疏附县| 海原县| 同心县| 临泉县| 五家渠市| 新巴尔虎左旗| 津南区| 芜湖市| 沾益县| 阿瓦提县| 鄂托克前旗| 什邡市|