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

📄 211.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<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="185.htm">上一层</a>][<a href="212.htm">下一篇</a>]
<hr><p align="left"><small>发信人: ysqcn (岁月无声), 信区: UNP <br>

标  题: 递归编历FTP目录的程序 <br>

发信站: UNIX编程 (Tue Sep 18 23:29:46 2001) , 转信 <br>

  <br>

下面的程序的目的是获取FTP上的目录列表,整理成树状结构。大部分是拷贝 <br>

netkit-ftp-0.17中的代码,自己到没有写什么。难保运行时不出什么错误, <br>

网络通畅的时候,匿名从根目录递归ftp://csun.hust.edu.cn至底下五层子目 <br>

录还没有出什么问题。不知fion做的怎么样了,贴出来起个抛转引玉的作用。 <br>

原理就不多说了,就是对子目录递归CD然后LIST。程序中一个-b参数是为了编 <br>

历结果生成的文件方便的贴在BBS。 <br>

  <br>

  <br>

/* <br>

buildftpfilelist.c:递归编历FTP目录,形成目录树 <br>

gcc -O6 -Wall -o buildftpfilelist buildftpfilelist.c <br>

注:大部分代码来自于netkit-ftp-0.17,自己又剽窃了一回 <br>

实在对不住作者,这里只能对他们表示感谢,呵呵 <br>

*/ <br>

  <br>

#include <stdio.h> <br>

#include <stdlib.h> <br>

#include <unistd.h> <br>

#include <sys/types.h> <br>



#include <sys/socket.h> <br>

#include <netinet/in.h> <br>

#include <arpa/inet.h> <br>

#include <arpa/ftp.h> <br>

#include <netdb.h> <br>

#include <string.h> <br>

#include <ctype.h> <br>

#include <stdarg.h> <br>

#include <getopt.h> <br>

  <br>

#define UC(b)   (((int)b)&0xff) <br>

#define ESC     0X1B <br>

#define YELLOW  "[1;33;40m" <br>

#define GREEN   "[1;36;40m" <br>

#define WHITE   "[1;37;40m" <br>

void process_argument(int argc,char **argv); <br>

void connectftp(char *host); <br>

void loginftp(char *user,char *passwd); <br>

void init_recurse(char * localfile); <br>

void recurseftpdir(char * dirname,int level); <br>

void finish_recurse(void); <br>

  <br>

  <br>

int  cd(char *dir); <br>

int  command(const char *fmt,...); <br>

int  getreply(int expecteof); <br>

int  recvrequest(const char *cmd,char *remote); <br>

int  initconn(void); <br>

FILE * dataconn(const char *lmode); <br>

  <br>

void prnvertline(int ); <br>

void gotoneitem(int level,int dir,int begin,char *name); <br>

void usage(char * prgname); <br>

  <br>

char host[128],user[64],passwd[64],startdir[128],localfile[64]; <br>

int  level,bbs=0; <br>

FILE *cin,*cout,*din,*fout; <br>

FILE *lfp;   /*file to store the recursing result*/ <br>

int  code; <br>

  <br>

struct sockaddr_in localaddr; <br>

int    datasock; <br>

int    verbose=1; <br>

  <br>

#define  FTPDIR struct ftpdir <br>



FTPDIR <br>

{ <br>

  char dirname[256]; <br>

  FTPDIR *nextdir; <br>

}; <br>

  <br>

char buffline[1024]; <br>

  <br>

int main(int argc,char *argv[]) <br>

{ <br>

  process_argument( argc,argv ); <br>

  connectftp( host ); <br>

  loginftp(user,passwd); <br>

  init_recurse( localfile ); <br>

  recurseftpdir( startdir,1 ); <br>

  finish_recurse(); <br>

  <br>

  return 0; <br>

} <br>

  <br>

void process_argument(int argc,char **argv) <br>

{ <br>

{ <br>

  char c,*prgname; <br>

  <br>

  strcpy(user,"anonymous"); <br>

  strcpy(passwd,"ysqcn@263.net"); <br>

  strcpy(startdir,"/"); <br>

  strcpy(localfile,"-"); <br>

  level = 5; <br>

  <br>

  prgname=*argv; <br>

  opterr = 0; <br>

  while (  ( c = getopt(argc,argv,"h:u:p:d:f:l:?b") ) != EOF ) <br>

    { <br>

      switch ( c ) <br>

    { <br>

    case 'u': <br>

      strncpy( user,optarg,sizeof( user ) ); <br>

      break; <br>

    case 'p': <br>

      strncpy( passwd,optarg,sizeof( passwd ) ); <br>

      break; <br>

    case 'd': <br>

      strncpy( startdir,optarg,sizeof( startdir ) ); <br>



      break; <br>

    case 'f': <br>

      strncpy( localfile,optarg,sizeof( localfile ) ); <br>

      break; <br>

    case 'l': <br>

      level = atoi ( optarg ); <br>

      break; <br>

    case 'b': <br>

      bbs = 1; <br>

      break; <br>

    case ':': <br>

    case '?': <br>

    case 'h': <br>

      usage(argv[0]); <br>

      exit(0); <br>

    } <br>

    } <br>

  argc -= optind; <br>

  argv += optind; <br>

  if ( argc == 0 ) <br>

    { <br>

      usage(prgname); <br>



      exit(-1); <br>

    } <br>

  strncpy(host,*argv,sizeof(host)); <br>

  <br>

  return; <br>

} <br>

  <br>

void init_recurse(char * localfile) <br>

{ <br>

  if ( strcmp(localfile,"-") == 0 ) <br>

    lfp = stdout ; <br>

  else <br>

    if (  ( lfp = fopen( localfile,"w+" ) ) == NULL ) <br>

      { <br>

    fprintf(stderr,"Open local file failed,output to stdout.\n"); <br>

    lfp = stdout; <br>

      } <br>

  <br>

  if ( cd( startdir ) ) <br>

    { <br>

      fprintf(stderr,"Can't cd directory %s.\n",startdir); <br>

      exit(-1); <br>



    } <br>

  <br>

  if ( command ("TYPE %s","A") != COMPLETE ) <br>

    fprintf(stderr,"Set ascii mode failed.\n"); <br>

  if ( bbs ) <br>

    { <br>

      fprintf(lfp,"%c%c",ESC,ESC); <br>

      fprintf(lfp,"%s",WHITE); <br>

    } <br>

  verbose = 0; <br>

  fprintf(stdout,"\nBegin recursing ftp directory\n"); <br>

  <br>

  return; <br>

} <br>

  <br>

void connectftp(char *host) <br>

{ <br>

  struct servent *sp; <br>

  register struct hostent *hp = 0; <br>

  struct sockaddr_in  servaddr; <br>

  int s,len; <br>

  <br>

  <br>

  bzero( &servaddr,sizeof( servaddr ) ); <br>

  servaddr.sin_family = AF_INET; <br>

  if ( inet_pton( AF_INET,host, &servaddr.sin_addr ) != 1 ) <br>

    { <br>

      hp = gethostbyname(host); <br>

      if (hp == NULL) <br>

    { <br>

      fprintf(stderr,"Get ftp ip address failed,exit.\n"); <br>

      exit(-1); <br>

    } <br>

      servaddr.sin_family = hp->h_addrtype; <br>

      if ( hp->h_length > (int)sizeof(servaddr.sin_addr) ) <br>

    hp->h_length = sizeof(servaddr.sin_addr); <br>

      memcpy(&servaddr.sin_addr,hp->h_addr,hp->h_length); <br>

    } <br>

  <br>

  sp = getservbyname("ftp", "tcp"); <br>

  if (sp == 0) <br>

    { <br>

      fprintf(stderr,"Get ftp service failed,exit.\n"); <br>

      exit(-1); <br>

    } <br>

    } <br>

  <br>

  servaddr.sin_port=sp->s_port; <br>

  <br>

  if (  ( s = socket(AF_INET,SOCK_STREAM,0) ) == -1) <br>

    { <br>

      fprintf(stderr,"Create control socket faild,exit.\n"); <br>

      exit(-1); <br>

    } <br>

  <br>

  if ( connect(s, (struct sockaddr *)&servaddr, sizeof (servaddr)) < 0) <br>

    { <br>

      fprintf(stderr,"Connect ftp server faild,exit.\n"); <br>

      exit(-1); <br>

    } <br>

  len = sizeof(localaddr); <br>

  if ( getsockname( s,(struct sockaddr *)&localaddr,&len ) < 0 ) <br>

    { <br>

      fprintf(stderr,"Get control socket name faild,exit.\n"); <br>

      exit(-1); <br>

    } <br>

  <br>

  cin = fdopen(s, "r"); <br>



  cout = fdopen(s, "w"); <br>

  if (cin == NULL || cout == NULL) <br>

    { <br>

      fprintf(stderr,"Control socket fdopen faild,exit.\n"); <br>

      if (cin) <br>

    (void) fclose(cin); <br>

      if (cout) <br>

    (void) fclose(cout); <br>

      exit(-1); <br>

    } <br>

  <br>

  /* read startup message from server */ <br>

  if (getreply(0) > 2) <br>

    { <br>

      if (cin) <br>

    (void) fclose(cin); <br>

      if (cout) <br>

    (void) fclose(cout); <br>

      fprintf(stderr,"Ftp server reply incorrectly,exit.\n"); <br>

      exit(-1); <br>

    } <br>

  return; <br>

  return; <br>

} <br>

  <br>

void loginftp(char *user,char *passwd) <br>

{ <br>

  int n; <br>

  <br>

  n = command("USER %s", user); <br>

  if (n == CONTINUE) <br>

    n = command("PASS %s", passwd); <br>

  <br>

  if (n != COMPLETE) <br>

    { <br>

      fprintf(stderr, "Login ftp server failed,exit.\n"); <br>

      exit(0); <br>

    } <br>

  <br>

  return; <br>

} <br>

  <br>

  <br>

void recurseftpdir(char * dirname,int level0) <br>

{ <br>

{ <br>

  char mode[16],name[256],*pname,*tmpdir; <br>

  FTPDIR *dirhd=NULL,*current=NULL,*tmp; <br>

  <br>

  if ( level0 > level ) <br>

    return; <br>

  <br>

  if ( lfp != stdout ) <br>

    fprintf(stdout,"."); <br>

  <br>

  if ( ( fout = tmpfile() ) == NULL ) <br>

    { <br>

      fprintf(stderr,"Open temp file failed,exit\n"); <br>

      exit(-1); <br>

    } <br>

  <br>

  if ( recvrequest("LIST",".") ) <br>

    return; <br>

  <br>

  (void)fflush(fout); <br>

  rewind(fout); <br>

  <br>

  while ( fgets(buffline,1024,fout) != NULL ) <br>



    { <br>

      sscanf(buffline,"%s%*s%*s%*s%*s%*s%*s%*s%s",mode,name); <br>

  <br>

      if ( ( mode[0] != 'd' && mode[0] != '-' ) || !strcmp(name,".") || !strcmp( <br>

name,"..") ) <br>

        continue; <br>

  <br>

      /* handle the name which includes space*/ <br>

      buffline[strlen(buffline)-1]='\0'; <br>

      pname = strstr(buffline,name); <br>

      strncpy( name,pname,sizeof(name) ); <br>

  <br>

      if ( mode[0] == 'd' ) <br>

        { <br>

          tmp=(FTPDIR *) malloc( sizeof(FTPDIR) ); <br>

          strncpy( tmp->dirname,name,sizeof(tmp->dirname) ); <br>

          tmp->nextdir = NULL; <br>

          if ( dirhd == NULL ) <br>

            dirhd = tmp; <br>

          else <br>

            current->nextdir = tmp; <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -