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

📄 ftp_wzm.cpp

📁 带DirectFB界面的FTP客户端
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "wzm.h"char fileinfo[MAXNUM];static void AlrmHandler(int signum){	ofstream ofs;	signal( SIGALRM, AlrmHandler );	ofs.open( DEBUGFILE, ios::out|ios::app );	if( ofs )	{		ofs<<" Time Out!"<<endl;		ofs.flush();		ofs.close();	}	else		ERR(" Time Out!");}wsocket::wsocket(){			socket_id = socket( PF_INET,SOCK_STREAM,0 );		if( socket_id < 0 )		perror( "wsocket::wsocket()" );}wsocket::~wsocket(){	if( socket_id > 0 )		close( socket_id );	}int wsocket::sockConnect(){		int err = 0;		if( socket_id > 0 )	{		err = connect( socket_id, &sa.sa, sizeof(sa.sa) );		if( err < 0 )			perror( "wsocket::sockConnect()" );	}	else	{		ERR( "wsocket::sockConnect socket init fail! " );		return socket_id;	}		return err;}int wsocket::setAddr( const string &ip, const int port ){	memset( &sa, 0, sizeof(sa) );	sa.sin.sin_family = AF_INET;	sa.sin.sin_port = htons( port );	sa.sin.sin_addr.s_addr = inet_addr( ip.c_str() );		return 0;	}int wsocket::setAddr( const unsigned int *v ){	memset( &sa, 0, sizeof(sa) );	sa.sa.sa_family = AF_INET;	sa.sa.sa_data[2] = v[2];	sa.sa.sa_data[3] = v[3];	sa.sa.sa_data[4] = v[4];	sa.sa.sa_data[5] = v[5];	sa.sa.sa_data[0] = v[0];	sa.sa.sa_data[1] = v[1];			return 0;}int wsocket::sockServer( unsigned int *v ){	int err = 0;			sa.sin.sin_port = 0;		if( socket_id > 0 )	{		err = bind( socket_id, &sa.sa, sizeof(sa.sa) );		if( err < 0 )			perror( "wsocket::sockServer bind()" );		else		{			err = listen( socket_id, 1 );			if( err < 0 )				perror( "wsocket::sockServer listen()" );			else			{				if( sockName( v ) )						ERR("wsocket::sockServer sockName fail!");			}		}	}	else	{		ERR( "wsocket::sockServer socket init fail! " );		return socket_id;	}		return err;		}int wsocket::sockAccept( ){	int id = -1;		if( socket_id > 0 )	{		socklen_t l= sizeof(sa.sa);				alarm(TIMEOUT);		id = accept( socket_id, &sa.sa, &l );		alarm(0);		if( id < 0 )			perror( "wsocket::sockAccept()" );					if( sockClose() < 0 )		{			ERR( "wsocket::sockAccept() close socket fail!" );			return -1;		}				if( id < 0 )			return id;					socket_id = id;			}	else	{		ERR( "wsocket::sockConnect socket init fail! " );		return socket_id;	}		return 0;		}int wsocket::sockName( unsigned int *v ) {	socklen_t l = sizeof(sa.sa);		if ( getsockname( socket_id , &sa.sa, &l ) < 0 )	{		perror("wsocket::sockName()");	    return 1;		}		v[2] = (unsigned int) sa.sa.sa_data[2];	v[3] = (unsigned int) sa.sa.sa_data[3];	v[4] = (unsigned int) sa.sa.sa_data[4];	v[5] = (unsigned int) sa.sa.sa_data[5];	v[0] = (unsigned int) sa.sa.sa_data[0];	v[1] = (unsigned int) sa.sa.sa_data[1];		return 0;}int wsocket::sockRecv( char *buf ){	fd_set rfds;	struct timeval tv;	int ret = 0;		FD_ZERO( &rfds );	FD_SET( socket_id, &rfds );		tv.tv_sec = TIMEOUT;    tv.tv_usec = 0;	select( socket_id+1, &rfds, NULL, NULL, &tv );	if( FD_ISSET( socket_id, &rfds ) )		ret = read( socket_id, buf, MAXNUM );			if( ret < 0 )		perror( "wsocket::sockRecv()" );			return ret;}int wsocket::sockSend( const char *buf, const int &len ){	fd_set wfds;	struct timeval tv;	int ret = -1;		FD_ZERO( &wfds );	FD_SET( socket_id, &wfds );		tv.tv_sec = TIMEOUT;    tv.tv_usec = 0;	select( socket_id+1, NULL, &wfds, NULL, &tv );	if( FD_ISSET( socket_id, &wfds ) )			ret = write( socket_id, buf, len );			if( ret < 0 )		perror( "wsocket::sockSend()" );				return ret;}int wsocket::sockClose(){	int err = 0;		if( socket_id > 0 )	{		err = close( socket_id );			if( err < 0 )			perror( "wsocket::sockClose()" );	}		return err;}FtpPI::FtpPI(){	int i = 0;		do	{		ofs.open( DEBUGFILE, ios::out|ios::app );	}while( !ofs && ++i < 10 );		if( i>= 10 )		ERR("open file [%s] fail!", DEBUGFILE );		}FtpPI::~FtpPI(){	if( ofs )		ofs.close();}void FtpPI::putstring( const char *buf ){	if( ofs )	{		ofs << buf;			ofs.flush();	}	else		ERR( "%s", buf );}int  FtpPI::GetAddr( unsigned int *v ){	if( sockName( v ) )			putstring("FtpPI::GetAddr get addr fail!\n");			return 0;}int FtpPI::ConServ( const string &ip ){	int err = 1;		if( !setAddr( ip, 21 ) )	{		err = sockConnect();		if( err < 0 )			putstring("FtpPI::ConServ connect fail!\n");	}	else	{		putstring("FtpPI::ConServ set addr fail!\n");		return err;	}		return err;}int FtpPI::SendCmd( const string &cmd, const string &result ){	string buffer;		buffer = cmd + "\r\n";	putstring( buffer.c_str() );		if( sockSend( buffer.c_str(), buffer.length() ) <= 0 )	{		putstring(" FtpPI::SendCmd send fail!\n");		return 1;	}		return RecvCmd( result );	}int FtpPI::RecvCmd( const string &result ){	char *buf;	int strlong = 0;	bool match = false;	string tmp;		if( NULL == (buf = (char *)calloc( MAXNUM,1 )))	{		putstring( "FtpPI::RecvCmd calloc fail!" );		return 1;	}		try	{		if( result.empty() )			return 2;		while( strlong <= (MAXNUM) )		{			int ret=0;						ret = sockRecv( buf+strlong );			if( ret <= 0 )				break;			laststring = buf + strlong;			putstring( laststring.c_str() );			if( *(buf+strlong+3) != '-' )			{									if( match == false )						break;				else				{					if( laststring.find( tmp,0 ) != string::npos )								break;					}			}			else			{				match = true;				tmp = laststring.substr( 0, 3 );			}			strlong += ret;					}		if( laststring.find( result.substr( 0, 3 ),0 ) == string::npos ) 		{			putstring("FtpPI::RecvCmd recv and result differ!\n");			free( buf );			return 2;		}			}	catch( ... )	{		putstring("FtpPI::RecvCmd catch except!\n");			free( buf );		return 3;	}		free( buf );	return 0;}int FtpPI::ClsServ(){	int err = 0;		err = sockClose();		if( err < 0 )		putstring("FtpPI::ClsServ fail!\n");			return err;}int FtpDTP::ConnData( const string &iport, const char *filename ){	unsigned int v[6];	int err = 0;		if( filename == NULL || strlen(filename) <= 0 )		file = TEMPFILE;	else		file = filename;		try	{		sscanf(iport.c_str(),"(%u,%u,%u,%u,%u,%u)",&v[2],&v[3],&v[4],&v[5],&v[0],&v[1]);	}	catch( ... )	{		ERR( "FtpDTP::ConnData string [%s] fail!", iport.c_str());			return 1;	}		if( !setAddr( v ) )		err = sockConnect();			if( err < 0 )		ERR( "FtpDTP::ConnData conncet [%s] fail!", iport.c_str() );		return err;}int FtpDTP::DataServer( unsigned int *v, const char *filename ){	if( filename == NULL || strlen(filename) <= 0 )		file = TEMPFILE;	else		file = filename;		if( setAddr( v ) )		{		ERR("FtpDTP::DataServer set addr fail!");		return 1;	}		if( sockServer( v ) )	{		ERR("FtpDTP::DataServer server fail!");		return 2;		}		return 0;}int FtpDTP::DataAccept(  ){	if( sockAccept() < 0 )		return 1;	return 0;	}int FtpDTP::SendData(  const char &type ){	char buf[MAXNUM];	ifstream fs;		if( type == 'a' )		fs.open( file.c_str() );	else		fs.open( file.c_str(), ios::binary );		if( fs )	{		while( fs.good() )		{			if( type == 'a' )			{				fs.getline( buf, sizeof(buf) );						sprintf( buf, "%s%s", buf, "\r\n" );						if( sockSend( buf, strlen(buf) ) < 0 )				{					ERR( "FtpDTP::SendData send data [%s] fail!", buf );					return 1;				}				}			else			{				fs.read( buf, MAXNUM );								if( sockSend( buf, MAXNUM ) < 0 )				{					ERR( "FtpDTP::SendData send data [%s] fail!", buf );					return 1;				}			}		}		fs.close();	}	else	{		ERR( "FtpDTP::SendData open file [%s] fail!", file.c_str() );			return 2;	}			return 0;}int FtpDTP::RecvData( const char &type ){	char *buf;	int ret;	ofstream fs;		if( type == 'a' )		fs.open( file.c_str() );	else		fs.open( file.c_str(), ios::binary );		if( fs )	{		if( !(buf = (char *)malloc( MAXNUM+1 )))		{			ERR("FtpDTP::RecvData malloc fail!");			return 1;		}		memset( buf, 0, MAXNUM+1 );		while( (ret = sockRecv( buf )) > 0 )		{			if( type == 'a' )				fs << buf;			else				fs.write( buf, ret );			memset( buf, 0, MAXNUM+1 );		}					free( buf );		fs.flush();		fs.close();		if( ret < 0 )		{			ERR("FtpDTP::RecvData recv data fail!");			return 2;		}	}	else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -