📄 211.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="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 + -