📄 ftp_wzm.cpp
字号:
{ ERR( "FtpDTP::RecvData open file [%s] fail!", file.c_str() ); return 2; } return 0;}int FtpDTP::ClosData(){ int err = 0; err = sockClose(); if( err < 0 ) ERR( "FtpDTP::ClosData fail!"); return err;}int FtpInterface::LogInServ( const char *ip, const char *usr, const char *pwd ){ string cmd; if( (ip == NULL || strlen(ip) <= 0) ||(usr == NULL || strlen(usr) <= 0) ||(pwd == NULL )) { ERR( "FtpInterface::LogInServ [%s][%s][%s].", ip, usr, pwd ); return -1; } cmd = ip; if(ConServ( cmd )) return 1; RecvCmd( "220" ); cmd = usr; cmd = "user "+ cmd; if(SendCmd( cmd, "331" )) return 2; cmd = pwd; cmd = "pass " + cmd; if(SendCmd( cmd, "230" )) return 3; if(SendCmd( "type a", "200" )) ERR( "acsii type fail!" ); type = 'a'; mode = 'a'; num = MAXTHEAD; pid = getpid(); return 0; }int FtpInterface::PortDTP( FtpDTP &dtp, const char *file ){ unsigned int v[6]; char buffer[MAXNUM]; if( GetAddr( v ) ) return 1; if( dtp.DataServer( v, file ) ) return 2; sprintf( buffer, "port %d,%d,%d,%d,%d,%d", (unsigned char) v[2], (unsigned char) v[3], (unsigned char) v[4], (unsigned char) v[5], (unsigned char) v[0], (unsigned char) v[1]); if( SendCmd( buffer, "200" ) ) return 3; return 0;}int FtpInterface::PasvDTP( FtpDTP &dtp, const char *file ){ string iport; int pos; if( SendCmd( "pasv", "227" )) return 1; iport = getlast(); try { if( ( pos = iport.find( "(", 0 )) == string::npos ) return 2; if(dtp.ConnData( iport.substr( pos, -1 ), file )) return 3; } catch( ... ) { ERR( "FtpInterface::List pasv recv [%s] fail!", iport.c_str() ); return 4; } return 0;}int FtpInterface::List( const char *file ){ FtpDTP dtp; if( mode == 'a' ) { if( PasvDTP( dtp, file ) ) return 1; } else { if( PortDTP( dtp, file ) ) return 1; } if( SendCmd( "list", "150" ) ) return 5; if( mode != 'a' ) if( dtp.DataAccept() ) return 6; if( dtp.RecvData( type ) ) return 7; if( dtp.ClosData() ) return 8; if( RecvCmd( "226" ) ) return 9; if( SendCmd( "pwd", "257" ) ) return 10; return 0;}void *pRecvData( void *fi ){ FtpDTP dtp; string cmd; int err = 0; char mode,type; char file[MAXNUM]; FtpInterface *p = (FtpInterface *)fi; p->num--; mode = p->mode; type = p->type; strcpy( file, p->file ); if( file == NULL || strlen(file) <= 0 ) { ERR( "don't know this file [%s].", p->file ); err = 1; goto END; } if( mode == 'a' ) { if( p->PasvDTP( dtp, p->file ) ) { err = 2; goto END; } } else { if( p->PortDTP( dtp, file ) ) { err = 3; goto END; } } cmd = file; cmd = "retr " + cmd; if( p->SendCmd( cmd, "150" ) ) { err = 4; goto END; } if( mode != 'a' ) if( dtp.DataAccept() ) { err = 5; goto END; } if( dtp.RecvData( type ) ) { err = 6; goto END; } if( dtp.ClosData() ) { err = 7; goto END; } if( p->RecvCmd( "226" ) ) { err = 8; goto END; }END: if( err ) sprintf( fileinfo, " Get File [%s] Fail!", file ); else sprintf( fileinfo, " Get File [%s] Ok!", file ); p->num++; kill( p->pid, SIGCHLD); pthread_exit(NULL); }int FtpInterface::GetFile( const char *filename ){ pthread_t threadsend; strcpy( file, filename ); if( num > 0 ) pthread_create(&threadsend, NULL, pRecvData, (void *)this ); return 0;}void *pSendData( void *fi ){ FtpDTP dtp; string cmd; int err = 0; char mode,type; char file[MAXNUM]; FtpInterface *p = (FtpInterface *)fi; p->num--; mode = p->mode; type = p->type; strcpy( file, p->file ); if( file == NULL || strlen(file) <= 0 ) { ERR( "don't know this file [%s].", p->file ); err = 1; goto END; } if( mode == 'a' ) { if( p->PasvDTP( dtp, file ) ) { err = 2; goto END; } } else { if( p->PortDTP( dtp, file ) ) { err = 3; goto END; } } cmd = file; cmd = "stor " + cmd; if( p->SendCmd( cmd, "150" ) ) { err = 4; goto END; } if( mode != 'a' ) if( dtp.DataAccept() ) { err = 5; goto END; } if( dtp.SendData( type ) ) { err = 6; goto END; } if( dtp.ClosData()) { err = 7; goto END; } if( p->RecvCmd( "226" ) ) { err = 8; goto END; } END: if( err ) sprintf( fileinfo, " Put File [%s] Fail!", file ); else sprintf( fileinfo, " Put File [%s] Ok!", file ); p->num++; kill( p->pid, SIGCHLD ); pthread_exit(NULL); }int FtpInterface::PutFile( char *filename ){ pthread_t threadsend; strcpy( file, filename ); if( num > 0 ) pthread_create(&threadsend, NULL, pSendData, (void *)this ); return 0;}int FtpInterface::Cwd( const char *dir ){ string cmd = "cwd "; if( dir == NULL || strlen(dir) <= 0 ) { ERR( "don't know this dir [%s].", dir ); return -1; } cmd += dir; if( SendCmd( cmd, "250" ) ) return 2; return 0; }int FtpInterface::DeleFile( const char *file ){ string cmd = "dele "; if( file == NULL || strlen(file) <= 0 ) { ERR( "don't know this file [%s].", file ); return -1; } cmd += file; if( SendCmd( cmd, "250" ) ) return 1; return 0; }int FtpInterface::Mkd( const char *dir ){ string cmd = "mkd "; if( dir == NULL || strlen(dir) <= 0 ) { ERR( "don't know this dir [%s].", dir ); return -1; } cmd += dir; if( SendCmd( cmd, "257" ) ) return 1; return 0; }int FtpInterface::Rmd( const char *dir ){ string cmd = "rmd "; if( dir == NULL || strlen(dir) <= 0 ) { ERR( "don't know this dir [%s].", dir ); return -1; } cmd += dir; if( SendCmd( cmd, "250" ) ) return 1; return 0; }int FtpInterface::ReName( char *cmd ){ char buffer[MAXNUM]; char *p; if( cmd == NULL || strlen(cmd) <= 0 ) { ERR( "don't know this cmd [%s].", cmd ); return -1; } p = strtok(cmd , " "); sprintf( buffer, "rnfr %s", p ); if( SendCmd( buffer, "350" ) ) return 1; p = strtok( NULL , " "); sprintf( buffer, "rnto %s", p ); if( SendCmd( buffer, "250" ) ) return 2; return 0; }int FtpInterface::Size( const char *file, char *ret ){ string str; if( file == NULL || strlen(file) <= 0 ) { ERR( "don't know this file [%s].", file ); return -1; } str = "size "; str += file; if( SendCmd( str, "213" ) ) return 1; str = getlast(); sprintf( ret, str.substr(3, -1 ).c_str() ); return 0; }int FtpInterface::SwitchType( char &m ){ char cmd[MAXNUM]; if( m != 'a' && m != 'i' ) { if( type == 'a' ) type = 'i'; else type = 'a'; m = type; } else type = m; sprintf( cmd, "type %c", type ); if( SendCmd( cmd, "200" ) ) return 1; return 0; }int FtpInterface::SwitchMode( char &m ){ if( m != 'a' && m != 'o' ) { if( mode == 'a' ) mode = 'o'; else mode = 'a'; m = mode; } else mode = m; return 0; }int FtpInterface::Mdtm( const char *file, char *ret ){ string str; if( file == NULL || strlen(file) <= 0 ) { ERR( "don't know this file [%s].", file ); return -1; } str = "mdtm "; str += file; if( SendCmd( str, "213" ) ) return 1; str = getlast(); sprintf( ret, str.substr(3, -1 ).c_str() ); return 0; }int FtpInterface::Abort( ){ if( SendCmd( "abor", "426" ) ) return 1; if(RecvCmd( "226" )) return 2; return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -