📄 205.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="206.htm">下一篇</a>]
<hr><p align="left"><small>发信人: fion (fion), 信区: UNP <br>
标 题: ftp programming <br>
发信站: UNIX编程 (2001年07月31日21:23:38 星期二), 站内信件 <br>
<br>
发信人: xuyang (computer), 信区: Winsock <br>
标 题: Re: ftp programming? <br>
发信站: BBS 水木清华站 (Wed Oct 28 08:53:05 1998) WWW-POST <br>
<br>
【 在 wolfsmile (笑笑狼) 的大作中提到: 】 <br>
: 请问各位打下,有谁用socket边过FTP的程序,请介绍以下如何!!! <br>
: 小弟聆听指教! <br>
给你一个DEMO,不过这是UNIX下的,很容易修改以适应WinSock,更详细的 <br>
资料需要看RFC <br>
#include <sys/types.h> <br>
#include <sys/stat.h> <br>
#include <fcntl.h> <br>
#include <sys/socket.h> <br>
#include <netdb.h> <br>
#include <stdio.h> <br>
typedef unsigned long UINT4; <br>
<br>
int good_ipaddr( char *addr ) <br>
{ <br>
{ <br>
int dot_count; <br>
int digit_count; <br>
<br>
dot_count = 0; <br>
digit_count = 0; <br>
while ( *addr != 0 && *addr != ' ' ) { <br>
if ( *addr == '.' ) { <br>
dot_count ++; <br>
digit_count = 0; <br>
} <br>
else if ( !isdigit(*addr) ) <br>
dot_count = 5; <br>
else { <br>
digit_count ++; <br>
if ( digit_count > 3 ) dot_count = 5; <br>
} <br>
addr ++; <br>
} <br>
if ( dot_count != 3 ) return -1; <br>
return 0; <br>
} <br>
<br>
<br>
UINT4 ipstr2long( char *ip_str ) <br>
{ <br>
char buf[6]; <br>
char *ptr; <br>
int i; <br>
int count; <br>
UINT4 ipaddr; <br>
int cur_byte; <br>
<br>
ipaddr = 0; <br>
for ( i = 0; i < 4; i ++ ) { <br>
ptr = buf; <br>
count = 0; <br>
*ptr = 0; <br>
while ( *ip_str != '.' && *ip_str != 0 && count < 4 ) { <br>
if ( !isdigit(*ip_str) ) return 0; <br>
*ptr ++ = *ip_str ++; <br>
count ++; <br>
} <br>
if ( count >= 4 || count == 0 ) return 0; <br>
*ptr = 0; <br>
cur_byte = atoi(buf); <br>
if ( cur_byte < 0 || cur_byte > 254 ) return 0; <br>
ip_str ++; <br>
ipaddr = ipaddr << 8 | (UINT4)cur_byte; <br>
} <br>
return ipaddr; <br>
} <br>
<br>
UINT4 get_ipaddr( char * host ) <br>
{ <br>
struct hostent *hp; <br>
if ( good_ipaddr( host ) == 0 ) <br>
return ipstr2long( host ); <br>
else if ( (hp = gethostbyname( host )) == NULL ) <br>
return 0; <br>
return ntohl( *(UINT4 *)hp->h_addr ); <br>
} <br>
<br>
int connect_server( char *host, int port ) <br>
{ <br>
int ctrl_sock; <br>
UINT4 addr; <br>
struct sockaddr_in sin; <br>
char buf[512]; <br>
int result; <br>
int len; <br>
<br>
if ( (addr = get_ipaddr( host )) == 0 ) return -1; <br>
ctrl_sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); <br>
if ( ctrl_sock == -1 ) return -1; <br>
<br>
memset( (char *)&sin, 0, sizeof(struct sockaddr_in) ); <br>
sin.sin_family = AF_INET; <br>
sin.sin_port = htons( port ); <br>
sin.sin_addr._S_un._S_addr = htonl( addr ); <br>
if( connect(ctrl_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1 ) <br>
{ <br>
close( ctrl_sock ); <br>
return -1; <br>
} <br>
len = recv( ctrl_sock, buf, 512, 0 ); <br>
buf[len] = 0; <br>
sscanf( buf, "%d", &result ); <br>
if ( result != 220 ) { <br>
close( ctrl_sock ); <br>
return -1; <br>
} <br>
return ctrl_sock; <br>
} <br>
<br>
int ftp_sendcmd( int sock, char *cmd ) <br>
{ <br>
char buf[512]; <br>
int result; <br>
int len; <br>
<br>
if ( send( sock, cmd, strlen(cmd), 0 ) == -1 ) <br>
return -1; <br>
len = recv( sock, buf, 512, 0 ); <br>
if ( len < 1 ) return -1; <br>
buf[len] = 0; <br>
sscanf( buf, "%d", &result ); <br>
return result; <br>
} <br>
<br>
int login_server( int sock, char *user, char *pwd ) <br>
{ <br>
{ <br>
char buf[128]; <br>
int result; <br>
<br>
sprintf( buf, "USER %s\r\n", user ); <br>
result = ftp_sendcmd( sock, buf ); <br>
if ( result == 230 ) return 0; <br>
else if ( result == 331 ) { <br>
sprintf( buf, "PASS %s\r\n", pwd ); <br>
if ( ftp_sendcmd( sock, buf ) != 230 ) return -1; <br>
return 0; <br>
} <br>
else <br>
return -1; <br>
} <br>
<br>
int create_datasock( int ctrl_sock ) <br>
{ <br>
int lsn_sock; <br>
int d_sock; <br>
int port; <br>
int len; <br>
struct sockaddr_in sin; <br>
char cmd[128]; <br>
<br>
lsn_sock = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP ); <br>
if ( lsn_sock == -1 ) return -1; <br>
memset( (char *)&sin, 0, sizeof(sin) ); <br>
sin.sin_family = AF_INET; <br>
if( bind(lsn_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1 ) { <br>
close( lsn_sock ); <br>
return -1; <br>
} <br>
<br>
if( listen(lsn_sock, 2) == -1 ) { <br>
close( lsn_sock ); <br>
return -1; <br>
} <br>
<br>
len = sizeof( struct sockaddr ); <br>
if ( getsockname( lsn_sock, (struct sockaddr *)&sin, &len ) == -1 ) <br>
{ <br>
close( lsn_sock ); <br>
return -1; <br>
} <br>
} <br>
port = sin.sin_port; <br>
printf( "%d\n", port ); <br>
<br>
if( getsockname( ctrl_sock, (struct sockaddr *)&sin, &len ) == -1 ) <br>
{ <br>
close( lsn_sock ); <br>
return -1; <br>
} <br>
sprintf( cmd, "PORT %d,%d,%d,%d,%d,%d\r\n", <br>
sin.sin_addr.S_un.S_un_b.s_b1, <br>
sin.sin_addr.S_un.S_un_b.s_b2, <br>
sin.sin_addr.S_un.S_un_b.s_b3, <br>
sin.sin_addr.S_un.S_un_b.s_b4, <br>
port>>8, port&0xff ); <br>
if ( ftp_sendcmd( ctrl_sock, cmd ) != 200 ) { <br>
close( lsn_sock ); <br>
return -1; <br>
} <br>
return lsn_sock; <br>
} <br>
<br>
int ftp_setmode( int c_sock, char mode ) <br>
{ <br>
char buf[128]; <br>
sprintf( buf, "TYPE %c\r\n", mode ); <br>
if ( ftp_sendcmd( c_sock, buf ) != 200 ) <br>
return -1; <br>
else <br>
return 0; <br>
} <br>
<br>
int ftp_cwd( int c_sock, char *path ) <br>
{ <br>
char buf[128]; <br>
sprintf( buf, "CWD %s\r\n", path ); <br>
if ( ftp_sendcmd( c_sock, buf ) != 250 ) <br>
return -1; <br>
else <br>
return 0; <br>
} <br>
<br>
int ftp_cdup( int c_sock ) <br>
{ <br>
char buf[128]; <br>
if ( ftp_sendcmd( c_sock, "CDUP\r\n" ) != 250 ) <br>
return -1; <br>
else <br>
return 0; <br>
} <br>
<br>
int ftp_retrfile( int c_sock, char *s, char *d ) <br>
{ <br>
int d_sock; <br>
int l_sock; <br>
struct sockaddr sin; <br>
int len; <br>
char buf[512]; <br>
int handle; <br>
<br>
handle = open( d, O_WRONLY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE ); <br>
if ( handle == -1 ) return -1; <br>
l_sock = create_datasock( c_sock ); <br>
if ( l_sock == -1 ) return -1; <br>
sprintf( buf, "RETR %s\r\n", s ); <br>
if ( ftp_sendcmd( c_sock, buf ) >= 300 ) return -1; <br>
d_sock = accept( l_sock, &sin, &len ); <br>
close( l_sock ); <br>
while ( (len = recv( d_sock, buf, 512, 0 )) > 0 ) { <br>
write( handle, buf, len ); <br>
} <br>
len = recv( c_sock, buf, 512, 0 ); <br>
buf[len] = 0; <br>
close( d_sock ); <br>
close( handle ); <br>
return 0; <br>
} <br>
<br>
int ftp_renamefile( int c_sock, char *s, char *d ) <br>
{ <br>
char buf[512]; <br>
<br>
sprintf( buf, "RNFR %s\r\n", s ); <br>
if ( ftp_sendcmd( c_sock, buf ) != 350 ) return -1; <br>
sprintf( buf, "RNTO %s\r\n", d ); <br>
if ( ftp_sendcmd( c_sock, buf ) != 250 ) return -1; <br>
return 0; <br>
} <br>
<br>
<br>
int ftp_deletefile( int c_sock, char *s ) <br>
{ <br>
char buf[512]; <br>
<br>
sprintf( buf, "DELE %s\r\n", s ); <br>
if ( ftp_sendcmd( c_sock, buf ) != 250 ) return -1; <br>
return 0; <br>
} <br>
<br>
int ftp_connect( char *host, char *user, char *pwd ) <br>
{ <br>
int c_sock; <br>
c_sock = connect_server( host, 21 ); <br>
if ( c_sock == -1 ) return -1; <br>
if ( login_server( c_sock, user, pwd ) == -1 ) { <br>
close( c_sock ); <br>
return -1; <br>
} <br>
return c_sock; <br>
} <br>
<br>
main() <br>
main() <br>
{ <br>
int c_sock; <br>
int d_sock; <br>
c_sock = connect_server( "203.207.21.18", 21 ); <br>
if ( c_sock == -1 ) { <br>
printf( "connect error\n" ); <br>
return 1; <br>
} <br>
if ( login_server( c_sock, "test", "test98" ) == -1 ) { <br>
printf( "login error\n" ); <br>
close( c_sock ); <br>
return 1; <br>
} <br>
ftp_setmode( c_sock, 'A' ); <br>
ftp_cwd( c_sock, "bak" ); <br>
ftp_cwd( c_sock, "ipaccount" ); <br>
ftp_renamefile( c_sock, "ip_0001.c", "fff.c" ); <br>
<br>
ftp_sendcmd( c_sock, "QUIT\r\n" ); <br>
close( c_sock ); <br>
return 0; <br>
} <br>
<br>
<br>
-- <br>
-- <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.101.187.226] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="185.htm">上一层</a>][<a href="206.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 + -