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

📄 203.htm

📁 unix高级编程原吗
💻 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="204.htm">下一篇</a>]
<hr><p align="left"><small>judite <br>

(stranger) <br>

07/17/01 08:01 PM <br>

  ftp c programming <br>

请问PORT指令怎么用啊,我看了rfc,很简单还没man说的明了呢, <br>

man里说PORT 127,0,0,1,192,0之后server会联接到client的指定端口, <br>

但我用netstat没发现有这样一个联接啊。是不是还需要执行什么指令?谢谢! <br>

astonia <br>

(member) <br>

11/13/00 11:07 AM <br>

我提供一个使用ftp协议的程序片断,已经稳定运行了10个月. <br>

ftpapi.c: <br>

#include <signal.h> <br>

#include <stdarg.h> <br>

#include <errno.h> <br>

#include "ftpapi.h" <br>

#include "rdwr.h" <br>

const response_t response_err = RESPONSE_ERR; <br>

const response_t response_empty = RESPONSE_EMPTY; <br>

int read_line(buf_t *buf,char *buff,int maxlen){ <br>

   char ch; <br>

   int n,rc; <br>

   for ( n = 0; n < maxlen; ) { <br>



      if ((rc = read_1_byte(buf,&buff[n])) == 1) { <br>

         if (buff[n++] == '\n') break; <br>

      } else if (!rc) { <br>

         if (n == 0) return (0); <br>

  else break; <br>

      } else return -1; <br>

   } <br>

   buff[n-1] = 0; <br>

   return n; <br>

} <br>

int open_data_channel(ftp_t *ftp_info){ <br>

   struct sockaddr_in servaddr; <br>

   int so_reuseaddr = 1; <br>

   size_t servaddr_size = sizeof(servaddr); <br>

   /* socket */ <br>

   if ((ftp_info->data_channel_sockfd = socket(AF_INET,SOCK_STREAM,0))< 0) <br>

      return -1; <br>

   /* set reuse address */ <br>

    if(setsockopt(ftp_info->data_channel_sockfd,SOL_SOCKET,SO_REUSEADDR,&so_ <br>

reuseaddr,sizeof(so_reuseaddr)) < 0) { <br>

      (void) close(ftp_info->data_channel_sockfd); <br>

      return -1; <br>



   } <br>

   /* set servaddr */ <br>

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

   servaddr.sin_family = AF_INET; <br>

   servaddr.sin_addr.s_addr = htonl(INADDR_ANY); <br>

   /* bind, let kernel choose the port */ <br>

   if (bind(ftp_info->data_channel_sockfd,(SA *)&servaddr,servaddr_size)== - <br>

1) { <br>

      (void) close(ftp_info->data_channel_sockfd); <br>

      return -1; <br>

   } <br>

   /* listen to the port as a server*/ <br>

   if (listen(ftp_info->data_channel_sockfd,SOMAXCONN) == -1) { <br>

      (void) close(ftp_info->data_channel_sockfd); <br>

      return -1; <br>

   } <br>

   /* get port no choosed by kernel */ <br>

   if(getsockname(ftp_info->data_channel_sockfd,(SA*)&servaddr,&servaddr_siz <br>

e) == -1) { <br>

      (void) close(ftp_info->data_channel_sockfd); <br>

      return -1;   } <br>

//** <br>

//** <br>

   ftp_info->data_port = ntohs(servaddr.sin_port); <br>

   return ftp_info->data_channel_sockfd; <br>

/* return socketdescriptor */ <br>

} <br>

int ftp_command(ftp_t *ftp_info,const char *fmt,...){ <br>

   va_list ap; <br>

   char cmdline[MAXLINESIZE], recvline[MAXLINESIZE]; <br>

   int n = 0; <br>

   size_t cmdlen; <br>

   /* form command line */ <br>

   va_start(ap,fmt); <br>

   /* reserve the space of \r\n\0 */   vsnprintf(cmdline,sizeof(cmdline)-3,f <br>

mt,ap); <br>

   va_end(ap); <br>

   (void) strcat(cmdline,"\r\n"); <br>

   printf(cmdline); <br>

   /* command length */ <br>

   cmdlen = strlen(cmdline); <br>

   /* send cmd to ftpd */ <br>

   begin_send_cmd: <br>

   if ((n=write(ftp_info->command_channel_sockfd,&cmdline[0]+n,cmdlen)) < 0) <br>

 { <br>

 { <br>

      /* interrupted by signal */ <br>

      /* <br>

      if (errno == EINTR) { <br>

         n = 0; <br>

         goto begin_send_cmd;      } <br>

      */ <br>

      ftp_info->response = response_err; <br>

      return -1; <br>

/* send cmd to ftpd failed */ <br>

   }   if (n < cmdlen) { <br>

            /* send command incompletely */ <br>

      cmdlen -= n; <br>

/* resend from the break point */ <br>

      goto begin_send_cmd;   } <br>

/* get response */ <br>

   get_response(ftp_info); <br>

   return 0; <br>

/* succeed */ <br>

} <br>

int connect_to_ftpd(ftp_t *ftp_info,const char *ip,u_short port){   struct s <br>

ockaddr_in servaddr; <br>

   struct hostent *hp; <br>



   int n; <br>

   int errno_save; <br>

   char recvline[MAXLINESIZE]; <br>

   size_t servaddr_size = sizeof(servaddr); <br>

   bzero(ftp_info,sizeof(ftp_t)); <br>

   ftp_info->server_port = port; <br>

   /* socket command channel */ <br>

   if ((ftp_info->command_channel_sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) <br>

 return -1; <br>

   /* set zero to servaddr */ <br>

   bzero(&servaddr,servaddr_size); <br>

   /* set family to AF_INET */ <br>

   servaddr.sin_family = AF_INET; <br>

   /* change port to network byte order */ <br>

   servaddr.sin_port = htons(port); <br>

   /* get host by name or ip is an IP address presentation */ <br>

   if ((hp = gethostbyname(ip)) == NULL) { <br>

/* ip is an IP */ <br>

      if ((servaddr.sin_addr.s_addr = inet_addr(ip)) <= 0) { <br>

         errno_save = errno; <br>

         (void) close(ftp_info->command_channel_sockfd); <br>

         errno = errno_save; <br>



         return -1; <br>

      } <br>

   } else { <br>

/* ip is an alias */ <br>

      (void)memcpy(&servaddr.sin_addr,hp->h_addr_list[0],sizeof(servaddr.sin <br>

_addr)); <br>

   } <br>

/* connect to ftp server command channel */ <br>

   if (connect(ftp_info->command_channel_sockfd,(SA*)&servaddr,servaddr_size <br>

) < 0) { <br>

      errno_save = errno; <br>

      (void) close(ftp_info->command_channel_sockfd); <br>

      errno = errno_save; <br>

      return -1; <br>

   } <br>

/* get local ip connect to ftp server */ <br>

   if (getsockname(ftp_info->command_channel_sockfd,(SA*)&servaddr,&servaddr <br>

_size) == -1) { <br>

      errno_save = errno; <br>

      (void) close(ftp_info->command_channel_sockfd); <br>

      errno = errno_save; <br>

      return -1; <br>



   } <br>

   ftp_info->local_ip = servaddr.sin_addr.s_addr; <br>

/* get response from ftp server */ <br>

   get_response(ftp_info); <br>

   if (ftp_info->response.primary_code != 2) { <br>

      errno_save = errno; <br>

      (void) close(ftp_info->command_channel_sockfd); <br>

      errno = errno_save; <br>

      return -1; <br>

/* fail */ <br>

   } else { <br>

      return 0; <br>

/* succeed */ <br>

   } <br>

} <br>

void get_response(ftp_t *ftp_info){ <br>

   int n; <br>

   buf_t buf; <br>

   /* init buf */ <br>

   init_buf(&buf,ftp_info->command_channel_sockfd); <br>

/* get the response message from ftpd */ <br>

   n =read_line(&buf,&ftp_info->response_line[0],sizeof(ftp_info->response_l <br>



ine)-1); <br>

   if (n < 0) { <br>

      ftp_info->response = response_err; <br>

      (void) destroy_buf(&buf); <br>

      return; <br>

/* read socket failed */ <br>

   } <br>

   if (!n) { <br>

      ftp_info->response = response_empty; <br>

      (void) destroy_buf(&buf); <br>

      return; <br>

/* nothing read, socket closed */ <br>

   }printf("%s\n",ftp_info->response_line); <br>

   ftp_info->response.primary_code = ftp_info->response_line[0] - '0'; <br>

/* primary code */ <br>

   ftp_info->response.return_code = atoi(ftp_info->response_line); <br>

/* get response code */ <br>

   if (strlen(ftp_info->response_line) < 4 ||ftp_info->response_line[3] != ' <br>

-') { <br>

      (void) destroy_buf(&buf); <br>

      return; <br>

/* single line response */ <br>



   } <br>

/* handle multi-line responses */ <br>

   while (n) { <br>

/* sth else to read from socket*/ <br>

      n =read_line(&buf,&ftp_info->response_line[0],sizeof(ftp_info->respons <br>

e_line)-1); <br>

      if (n < 0) { <br>

         ftp_info->response = response_err; <br>

         (void) destroy_buf(&buf); <br>

         return; <br>

/* read socket failed */ <br>

      }printf("%s\n",ftp_info->response_line); <br>

      if (strlen(ftp_info->response_line) > 3 &&ftp_info->response_line[3] = <br>

= ' ' <br>

         && ftp_info->response.return_code ==atoi(ftp_info->response_line)) <br>

{ <br>

         (void) destroy_buf(&buf); <br>

         return; <br>

/* finish reading */ <br>

      } <br>

   } <br>

/* should not reach the next line <br>



* because when n == 0, it means the socket is closed by other end <br>

*/ <br>

   strcat(ftp_info->response_line,"\n"); <br>

   (void) destroy_buf(&buf); <br>

   return; <br>

/* succeed */ <br>

} <br>

int close_command_channel(ftp_t *ftp_info){ <br>

   return close(ftp_info->command_channel_sockfd);}intclose_data_channel(ftp <br>

_t *ftp_info){ <br>

   return close(ftp_info->data_channel_sockfd); <br>

} <br>

ftpapi.h: <br>

#ifndef _CS_FTPAPI_H_ <br>

#define _CS_FTPAPI_H_ <br>

#include <stdio.h> <br>

#include <stdlib.h> <br>

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

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

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

#include <inttypes.h> <br>

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



#include <netdb.h> <br>

#include <unistd.h> <br>

/* ftp server return codes */ <br>

#define FTPD_USERUNKOWN         530 <br>

/* user unkown */ <br>

#define FTPD_READY              220 <br>

/* ftp server ready */ <br>

#define FTPD_USERFIRST          503 <br>

/* login with USER first */ <br>

#define FTPD_BYE                221 <br>

/* goodbye */ <br>

#define FTPD_OK                 200 <br>

/* command successful */ <br>

#define FTPD_REQPASS            331 <br>

/* password required */ <br>

#define FTPD_LOGIN              230 <br>

/* user logged in */ <br>

#define FTPD_PWD                257 <br>

/* xx is current directory */ <br>

#define FTPD_CWD                250 <br>

/* CWD command successful */ <br>

#define FTPD_NOENT              550 <br>



/* no such file or dir */ <br>

#define FTPD_HELP               214 <br>

/* HELP message */ <br>

#define FTPD_CMDUNKOWN          500 <br>

/* command not understood */ <br>

#define FTPD_NOTIMPLE           502 <br>

/* command not implemented */ <br>

#define FTPD_CANTCONN           425 <br>

/* can't build data connection*/ <br>

#define FTPD_ASCCONN            150 <br>

/* data connection for xx */ <br>

#define FTPD_TRANCOMP           226 <br>

/* transfer complete */ <br>

#define FTPD_ABOR               225 <br>

/* ABOR command successful */ <br>

/* max size of response line */ <br>

#define MAXLINESIZE 1024 <br>

/* convinience for programming */ <br>

#define SA struct sockaddr <br>

/* define the data structure of the ftp server return code */ <br>

/* primary_code stores the primary code which indicates the <br>

* primary result from ftp server * return_code is the full 3-digit result <br>



* constant {-1, -1} indicates error occured, <br>

* and {0, 0} indicates empty response(maybe socket closed). <br>

*/ <br>

#define RESPONSE_ERR    {-1, -1} <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>

  <br>



  <br>

  <br>

  <br>

  <br>

  <br>

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