📄 203.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 + -