荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (UNIX+C+XML+?? 傻了?), 信区: Linux
标  题: ftp programming                        fion (转寄)[转载]
发信站: 荔园晨风BBS站 (Thu Apr 25 10:25:37 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@apue.dhs.org 所发表 】
发信人: fion (fion), 信区: UNP
标  题: ftp programming
发信站: UNIX编程 (2001年07月31日21:23:38 星期二), 站内信件

发信人: xuyang (computer), 信区: Winsock
标  题: Re: ftp programming?
发信站: BBS 水木清华站 (Wed Oct 28 08:53:05 1998) WWW-POST

【 在 wolfsmile (笑笑狼) 的大作中提到: 】
: 请问各位打下,有谁用socket边过FTP的程序,请介绍以下如何!!!
: 小弟聆听指教!
给你一个DEMO,不过这是UNIX下的,很容易修改以适应WinSock,更详细的
资料需要看RFC
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
typedef unsigned long UINT4;

int good_ipaddr( char *addr )
{
        int     dot_count;
        int     digit_count;

        dot_count = 0;
        digit_count = 0;
        while ( *addr != 0 && *addr != ' ' ) {
                if ( *addr == '.' ) {
                        dot_count ++;
                        digit_count = 0;
                }
                else if ( !isdigit(*addr) )
                        dot_count = 5;
                else {
                        digit_count ++;
                        if ( digit_count > 3 ) dot_count = 5;
                }
                addr ++;
        }
        if ( dot_count != 3 ) return -1;
        return 0;
}

UINT4 ipstr2long( char *ip_str )
{
        char    buf[6];
        char    *ptr;
        int     i;
        int     count;
        UINT4   ipaddr;
        int     cur_byte;

        ipaddr = 0;
        for ( i = 0; i < 4; i ++ ) {
                ptr = buf;
                count = 0;
                *ptr = 0;
                while ( *ip_str != '.' && *ip_str != 0 && count < 4 ) {
                        if ( !isdigit(*ip_str) ) return 0;
                        *ptr ++ = *ip_str ++;
                        count ++;
                }
                if ( count >= 4 || count == 0 ) return 0;
                *ptr = 0;
                cur_byte = atoi(buf);
                if ( cur_byte < 0 || cur_byte > 254 ) return 0;
                ip_str ++;
                ipaddr = ipaddr << 8 | (UINT4)cur_byte;
        }
        return ipaddr;
}

UINT4 get_ipaddr( char * host )
{
        struct hostent  *hp;
        if ( good_ipaddr( host ) == 0 )
                return ipstr2long( host );
        else if ( (hp = gethostbyname( host )) == NULL )
                return 0;
        return ntohl( *(UINT4 *)hp->h_addr );
}

int connect_server( char *host, int port )
{
        int     ctrl_sock;
        UINT4   addr;
        struct sockaddr_in sin;
        char    buf[512];
        int     result;
        int     len;

        if ( (addr = get_ipaddr( host )) == 0 ) return -1;
        ctrl_sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
        if ( ctrl_sock == -1 ) return -1;

        memset( (char *)&sin, 0, sizeof(struct sockaddr_in) );
        sin.sin_family = AF_INET;
        sin.sin_port = htons( port );
        sin.sin_addr._S_un._S_addr = htonl( addr );
        if( connect(ctrl_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1 )
{
                close( ctrl_sock );
                return -1;
        }
        len = recv( ctrl_sock, buf, 512, 0 );
        buf[len] = 0;
        sscanf( buf, "%d", &result );
        if ( result != 220 ) {
                close( ctrl_sock );
                return -1;
        }
        return ctrl_sock;
}

int ftp_sendcmd( int sock, char *cmd )
{
        char    buf[512];
        int     result;
        int     len;

        if ( send( sock, cmd, strlen(cmd), 0 ) == -1 )
                return -1;
        len = recv( sock, buf, 512, 0 );
        if ( len < 1 ) return -1;
        buf[len] = 0;
        sscanf( buf, "%d", &result );
        return result;
}

int login_server( int sock, char *user, char *pwd )
{
        char    buf[128];
        int     result;

        sprintf( buf, "USER %s\r\n", user );
        result = ftp_sendcmd( sock, buf );
        if ( result == 230 ) return 0;
        else if ( result == 331 ) {
                sprintf( buf, "PASS %s\r\n", pwd );
                if ( ftp_sendcmd( sock, buf ) != 230 ) return -1;
                return 0;
        }
        else
                return -1;
}

int create_datasock( int ctrl_sock )
{
        int     lsn_sock;
        int     d_sock;
        int     port;
        int     len;
        struct sockaddr_in sin;
        char    cmd[128];

        lsn_sock = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
        if ( lsn_sock == -1 ) return -1;
        memset( (char *)&sin, 0, sizeof(sin) );
        sin.sin_family = AF_INET;
        if( bind(lsn_sock, (struct sockaddr *)&sin, sizeof(sin)) == -1 ) {
                close( lsn_sock );
                return -1;
        }

        if( listen(lsn_sock, 2) == -1 ) {
                close( lsn_sock );
                return -1;
        }

        len = sizeof( struct sockaddr );
        if ( getsockname( lsn_sock, (struct sockaddr *)&sin, &len ) == -1 )
{
                close( lsn_sock );
                return -1;
        }
        port = sin.sin_port;
        printf( "%d\n", port );

        if( getsockname( ctrl_sock, (struct sockaddr *)&sin, &len ) == -1 )
{
                close( lsn_sock );
                return -1;
        }
        sprintf( cmd, "PORT %d,%d,%d,%d,%d,%d\r\n",
                 sin.sin_addr.S_un.S_un_b.s_b1,
                 sin.sin_addr.S_un.S_un_b.s_b2,
                 sin.sin_addr.S_un.S_un_b.s_b3,
                 sin.sin_addr.S_un.S_un_b.s_b4,
                 port>>8, port&0xff );
        if ( ftp_sendcmd( ctrl_sock, cmd ) != 200 ) {
                close( lsn_sock );
                return -1;
        }
        return lsn_sock;
}

int ftp_setmode( int c_sock, char mode )
{
        char    buf[128];
        sprintf( buf, "TYPE %c\r\n", mode );
        if ( ftp_sendcmd( c_sock, buf ) != 200 )
                return -1;
        else
                return 0;
}

int ftp_cwd( int c_sock, char *path )
{
        char    buf[128];
        sprintf( buf, "CWD %s\r\n", path );
        if ( ftp_sendcmd( c_sock, buf ) != 250 )
                return -1;
        else
                return 0;
}

int ftp_cdup( int c_sock )
{
        char    buf[128];
        if ( ftp_sendcmd( c_sock, "CDUP\r\n" ) != 250 )
                return -1;
        else
                return 0;
}

int ftp_retrfile( int c_sock, char *s, char *d )
{
        int     d_sock;
        int     l_sock;
        struct sockaddr sin;
        int     len;
        char    buf[512];
        int     handle;

        handle = open( d,  O_WRONLY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE );
        if ( handle == -1 ) return -1;
        l_sock = create_datasock( c_sock );
        if ( l_sock == -1 ) return -1;
        sprintf( buf, "RETR %s\r\n", s );
        if ( ftp_sendcmd( c_sock, buf ) >= 300 ) return -1;
        d_sock = accept( l_sock, &sin, &len );
        close( l_sock );
        while ( (len = recv( d_sock, buf, 512, 0 )) > 0 ) {
                write( handle, buf, len );
        }
        len = recv( c_sock, buf, 512, 0 );
        buf[len] = 0;
        close( d_sock );
        close( handle );
        return 0;
}

int ftp_renamefile( int c_sock, char *s, char *d )
{
        char    buf[512];

        sprintf( buf, "RNFR %s\r\n", s );
        if ( ftp_sendcmd( c_sock, buf ) != 350 ) return -1;
        sprintf( buf, "RNTO %s\r\n", d );
        if ( ftp_sendcmd( c_sock, buf ) != 250 ) return -1;
        return 0;
}

int ftp_deletefile( int c_sock, char *s )
{
        char    buf[512];

        sprintf( buf, "DELE %s\r\n", s );
        if ( ftp_sendcmd( c_sock, buf ) != 250 ) return -1;
        return 0;
}

int ftp_connect( char *host, char *user, char *pwd )
{
        int     c_sock;
        c_sock = connect_server( host, 21 );
        if ( c_sock == -1 ) return -1;
        if ( login_server( c_sock, user, pwd ) == -1 ) {
                close( c_sock );
                return -1;
        }
        return c_sock;
}

main()
{
        int     c_sock;
        int     d_sock;
        c_sock = connect_server( "203.207.21.18", 21 );
        if ( c_sock == -1 ) {
                printf( "connect error\n" );
                return 1;
        }
        if ( login_server( c_sock, "test", "test98" ) == -1 ) {
                printf( "login error\n" );
                close( c_sock );
                return 1;
        }
        ftp_setmode( c_sock, 'A' );
        ftp_cwd( c_sock, "bak" );
        ftp_cwd( c_sock, "ipaccount" );
        ftp_renamefile( c_sock, "ip_0001.c", "fff.c" );

        ftp_sendcmd( c_sock, "QUIT\r\n" );
        close( c_sock );
        return 0;
}


--
--
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.101.187.226] --
※ 转寄:·UNIX编程 apue.dhs.org·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店