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

📄 211.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
          current = tmp ; <br>



          continue; <br>

        } <br>

      gotoneitem(level0,0,0,name); <br>

    } <br>

  fclose(fout); <br>

  current = dirhd; <br>

  while ( current != NULL ) <br>

    { <br>

      tmpdir = current->dirname; <br>

      gotoneitem(level0,1,1,tmpdir); <br>

      if  ( cd( tmpdir ) == 0 ) <br>

    { <br>

      recurseftpdir(current->dirname,level0+1); <br>

      if ( cd("..") ) <br>

        { <br>

          fprintf(stderr,"Can't goto parent directory,exit.\n"); <br>

          exit(-1); <br>

        } <br>

    } <br>

      gotoneitem(level0,1,0,tmpdir); <br>

  <br>

      dirhd = current->nextdir; <br>



      free(current); <br>

      current = dirhd; <br>

    } <br>

} <br>

  <br>

void finish_recurse(void) <br>

{ <br>

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

  verbose=1; <br>

  command("QUIT"); <br>

} <br>

  <br>

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

{ <br>

  va_list ap; <br>

  int r; <br>

  <br>

  va_start(ap, fmt); <br>

  vfprintf(cout, fmt, ap); <br>

  va_end(ap); <br>

  fprintf(cout, "\r\n"); <br>

  (void) fflush(cout); <br>



  <br>

  r=getreply( !strcmp(fmt, "QUIT") ); <br>

  <br>

  return r; <br>

} <br>

  <br>

int  getreply(int expecteof) <br>

{ <br>

  register int c, n; <br>

  register int dig; <br>

  int originalcode = 0, continuation = 0; <br>

  char reply_string[BUFSIZ]; <br>

  char *cp; <br>

  <br>

  cp = reply_string; <br>

  for (;;) <br>

    { <br>

      dig = n = code = 0; <br>

      while ( ( c = getc( cin ) ) != '\n') <br>

    { <br>

      dig++; <br>

      if ( c == EOF ) <br>



        { <br>

          if (expecteof) <br>

        { <br>

          code = 221; <br>

          return (0); <br>

        } <br>

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

          exit(-1); <br>

        } <br>

  <br>

      if ( verbose && c != '\r'  ) <br>

        (void) putchar(c); <br>

  <br>

      if ( dig < 4 && isdigit(c) ) <br>

        code = code * 10 + (c - '0'); <br>

  <br>

      if ( dig == 4 && c == '-' ) <br>

        { <br>

          if (continuation) <br>

        code = 0; <br>

          continuation++; <br>

        } <br>

        } <br>

  <br>

          if ( cp < &reply_string[sizeof(reply_string)-1] ) <br>

        *cp++=c; <br>

  <br>

      if (n == 0) <br>

        n = c; <br>

    }/*end while*/ <br>

  <br>

      if ( verbose ) <br>

    (void) putchar(c); <br>

      (void) fflush (stdout); <br>

  <br>

  <br>

      if ( continuation && code != originalcode ) <br>

    { <br>

      if (originalcode == 0) <br>

        originalcode = code; <br>

      continue; <br>

    } <br>

      *cp='\0'; <br>

      return (n - '0'); <br>

    }/*end for*/ <br>



} <br>

  <br>

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

{ <br>

  int c,d,bytes=0,result; <br>

  char buf[1024]; <br>

  <br>

  if ( initconn() ) <br>

    { <br>

      code=-1; <br>

      return(-1); <br>

    } <br>

  <br>

  if (remote) <br>

    result = command("%s %s", cmd, remote); <br>

  else <br>

    result = command("%s", cmd); <br>

  if ( result != PRELIM ) <br>

    return -1 ; <br>

  <br>

  if (  ( din = dataconn("r") )== NULL ) <br>

    { <br>

    { <br>

      fprintf(stderr,"\nData connection failed,exit.\n"); <br>

      exit(-1); <br>

    } <br>

  <br>

 loopin: <br>

  while ( ( c = getc(din) ) != EOF ) <br>

    { <br>

      while ( c == '\r' ) <br>

    { <br>

      bytes++; <br>

      if ( ( c = getc(din) ) != '\n' ) <br>

        { <br>

          if ( ferror(fout) ) <br>

        goto loopout; <br>

          (void) putc('\r', fout); <br>

          if (c == '\0') <br>

        { <br>

          bytes++; <br>

          goto loopin; <br>

        } <br>

          if (c == EOF) <br>

        goto loopin; <br>



        } <br>

    } <br>

      (void) putc(c, fout); <br>

      bytes++; <br>

    } <br>

loopout: <br>

  if ( din ) <br>

    fclose(din); <br>

  if ( datasock >= 0 ) <br>

    { <br>

      close(datasock); <br>

      datasock = -1; <br>

    } <br>

  (void)getreply(0); <br>

  return(0); <br>

} <br>

  <br>

int  initconn(void) <br>

{ <br>

  register char * a ,* p; <br>

  socklen_t len; <br>

  int on = 1,result; <br>



  struct sockaddr_in dataaddr; <br>

  <br>

  if ( ( datasock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) <br>

    { <br>

      fprintf(stderr,"Data socket create faild,return.\n"); <br>

      return (-1); <br>

    } <br>

  if ( setsockopt( datasock,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on) ) < 0 <br>

) <br>

    fprintf(stderr,"Data socket reuse failed.\n"); <br>

  <br>

  dataaddr = localaddr; <br>

  <br>

  dataaddr.sin_port = 0; <br>

  <br>

  if (bind(datasock, (struct sockaddr *)&dataaddr, sizeof (dataaddr)) < 0) <br>

    { <br>

      fprintf(stderr,"Data socket bind faild,return.\n"); <br>

      return(-1); <br>

    } <br>

  <br>

  len = sizeof (dataaddr); <br>



  if (getsockname(datasock, (struct sockaddr *)&dataaddr, &len) < 0) <br>

    { <br>

      fprintf(stderr,"Data socket getsockname faild,return.\n"); <br>

      return(-1); <br>

    } <br>

  <br>

  if (listen(datasock, 1) < 0) <br>

    { <br>

      fprintf(stderr,"Data socket listen faild,return.\n"); <br>

      return(-1); <br>

    } <br>

  <br>

  a = (char *)&dataaddr.sin_addr; <br>

  p = (char *)&dataaddr.sin_port; <br>

  result = command("PORT %d,%d,%d,%d,%d,%d",UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3 <br>

]),UC(p[0]), UC(p[1])); <br>

  <br>

  if ( result == ERROR ) <br>

    { <br>

      fprintf(stderr,"Send PORT command faild,return.\n"); <br>

      return(-1); <br>

    } <br>

    } <br>

  <br>

  return(0); <br>

} <br>

  <br>

  <br>

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

{ <br>

  struct sockaddr_in from; <br>

  int s; <br>

  socklen_t fromlen = sizeof(from); <br>

  <br>

  s = accept(datasock, (struct sockaddr *) &from, &fromlen); <br>

  if (s < 0) <br>

    { <br>

      fprintf(stderr,"Data socket accept failed,exit.\n"); <br>

      (void) close(datasock), datasock = -1; <br>

     return (NULL); <br>

    } <br>

  (void) close(datasock); <br>

  datasock = s; <br>

  <br>

  return (fdopen(datasock, lmode)); <br>



} <br>

  <br>

  <br>

int cd(char *dir) <br>

{ <br>

  if ( command("CWD %s", dir) == ERROR ) <br>

    { <br>

      fprintf(stderr,"\nCan't cd directory %s\n",dir); <br>

      return -1; <br>

    } <br>

  return 0; <br>

} <br>

  <br>

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

{ <br>

  prnvertline(level); <br>

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

  if ( bbs ) <br>

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

  if ( dir ) <br>

    { <br>

      if ( bbs ) <br>



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

      if ( begin ) <br>

    fprintf(lfp,"%s","目录开始"); <br>

      else <br>

    fprintf(lfp,"%s","目录结束"); <br>

    } <br>

  else <br>

    { <br>

      if ( bbs ) <br>

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

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

    } <br>

  if ( bbs ) <br>

    { <br>

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

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

    } <br>

  fprintf(lfp,"%c%s\n",']',name); <br>

} <br>

  <br>

void prnvertline(int level) <br>

{ <br>

{ <br>

  int i; <br>

  for ( i=1;i<=level;i++ ) <br>

    fprintf(lfp,"%*c",i==1?1:3,'|'); <br>

} <br>

  <br>

void usage(char *prgname) <br>

{ <br>

  fprintf(stderr,"Usage:\t%s [-hupdflb] <host>\n",prgname); <br>

  fprintf(stderr,"\t-h   print this help infomation\n"); <br>

  fprintf(stderr,"\t-u   ftp user name (default anonymous)\n"); <br>

  fprintf(stderr,"\t-p   ftp passwd (default ysqcn@263.net)\n"); <br>

  fprintf(stderr,"\t-d   start directory (default /)\n"); <br>

  fprintf(stderr,"\t-f   file name to save the result (default -)\n"); <br>

  fprintf(stderr,"\t-l   the depth of Subdirectory (default 5)\n"); <br>

  fprintf(stderr,"\t-b   output file will be pasted on bbs ? (default no)\n"); <br>

  fprintf(stderr,"\thost ftp server name\n"); <br>

} <br>

  <br>

  <br>

  <br>

  <br>

-- <br>



※ 修改:·ysqcn 於 09月18日23:31:13 修改本文·[FROM: 211.69.197.81] <br>

※ 来源:.UNIX编程WWW apue.dhs.org. [FROM: 211.69.197.81] <br>

-- <br>

※ 修改:·ysqcn 於 09月18日23:38:23 修改本文·[FROM: 211.69.197.81] <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.197.81] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="185.htm">上一层</a>][<a href="212.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 + -