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

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