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

📄 ftpclient.cpp

📁 大家好,好久没做什么东西了,前些日子偶然看到本论坛的一个FTP多线程断点续传的源代码
💻 CPP
字号:
#include "StdAfx.h"
//#include ".\ftpclient.h"
#include "MainFrm.h"
#include "FileView.h"
#include "FTPTranserDoc.h"

CFTPClient::CFTPClient(CMainFrame * pa)
{
	parent = pa;
	mSocket = NULL;
	dataClient = NULL;
	busy = false;
	speed = 50000; //50k
	running = true;
}

CFTPClient::~CFTPClient(void)
{
	if(mSocket)
	{
		closesocket(mSocket);
		mSocket = NULL;
	}
	if(dataClient)
		closesocket(dataClient);

}


bool CFTPClient::Login(CString FTPserver,int FTPPort,CString FTPUser,CString FTPPass)
{
	//消息输出	
	AddMsg("欢迎使用FTPTranser多线程,断点续传软件!!\n");

	mSocket = ConnectTo(FTPserver,FTPPort);
	if(!mSocket)
		return false;
	
	AddMsg("连接服务器成功\n");
	
	//接收响应
	char * buffer = new char[100];
	int recLen ;	
	recLen = recv(mSocket,buffer,100,0);
	buffer[recLen]=0;
	AddMsg(buffer);

	CString user = "USER  "+FTPUser+" \r\n";
	AddMsg("发送用户名...");
	send(mSocket,user.GetBuffer(),user.GetLength(),0);	
	//接收响应
	recLen = recv(mSocket,buffer,100,0);
	buffer[recLen]=0;
	if(GetCode(buffer) == "331")
	{
		AddMsg("服务器要求验证密码。");
		CString password = "PASS "+FTPPass+" \r\n";
		this->AddMsg("发送密码...");
		send(mSocket,password.GetBuffer(),password.GetLength(),0);
		recLen = recv(mSocket,buffer,100,0);
		buffer[recLen]=0;
		int tryTimes = 3;
		while(GetCode(buffer) != "230" && tryTimes > 0)
		{
			send(mSocket,password.GetBuffer(),password.GetLength(),0);
			recLen = recv(mSocket,buffer,100,0);
			buffer[recLen]=0;
			tryTimes --;
			CString msg;
			msg.Format("第%d尝试",3-tryTimes);
			this->AddMsg(msg);
		}
		if(tryTimes < 0)
		{
			this->AddMsg(FTPUser +"登录失败!");
			delete[] buffer;
			return NULL;
		}
		else
			this->AddMsg("密码验证成功成功!");
	}
	char *type = "TYPE I \r\n";
	this->AddMsg("设置文件类型为二进制文件...");
	send(mSocket,type,(int)strlen(type),0);
	recLen = recv(mSocket,buffer,100,0);
	buffer[recLen]=0;
	if(GetCode(buffer) != "200")
	{
		AddMsg("设置失败");
		delete[] buffer;
		return false;
	}	
	AddMsg("设置成功");
	delete[] buffer;

	mServer = FTPserver;
	port = FTPPort;
	mUser = FTPUser;
	mPass = FTPPass;


	return true;
}
bool CFTPClient::Logout()
{
	return true;
}

bool CFTPClient::ChangeDirectory(CString dir)
{
	char buffer[200];
	CString command = "CWD  "+dir+" \r\n";
	//AddMsg("改变目录..."+dir);
	send(mSocket,command.GetBuffer(),command.GetLength(),0);	
	//接收响应
	int recLen = recv(mSocket,buffer,100,0);
	buffer[recLen]=0;
	if(GetCode(buffer).Compare("250") == 0)
		return true;
	else
		return false;
	
}

void CFTPClient::AddMsg(CString msg)
{
	if(parent)
		parent->AddMsg(msg);
}

CString CFTPClient::GetCode(CString revStr)
{
	CString str;
	int index ;
	index = revStr.Find(" ");
	str = revStr.Mid(0,index);
	return str;
}

CString CFTPClient::GetFileInfo(char * buf)
{
	CString str("");
	char* index = strstr(buf,"\r\n");
	if(index !=0)
	{
		*index = 0;
		str = buf;
		strcpy(buf,index+2);
	}
	//else
	//	buf[0] = 0;
	return str;
}

CString CFTPClient::GetHost(CString revStr)
{
	int index = revStr.Find('(');
	CString str = revStr.Mid(index + 1,revStr.GetLength() - index );
	CString temp;
	for(int i =0 ; i < 4 ;i ++)
	{
		index = str.Find(',');
		temp += str.Mid(0,index)+".";
		str = str.Mid(index + 1,str.GetLength() -index );
	}
	temp = temp.Mid(0,temp.GetLength() - 1) ;
	return temp;
}
int CFTPClient::GetPort(CString revStr)
{
	int index = revStr.Find('(');
	CString str = revStr.Mid(index+1,revStr.GetLength() - index);
	CString temp;
	for(int i =0 ; i < 4 ;i ++)
	{
		index = str.Find(',');
		str = str.Mid(index+1,str.GetLength() -index);
	}
	index = str.Find(',');
	temp  = str.Mid(0,index);
	str = str.Mid(index+1,str.GetLength()-index);
	index  = str.Find(')');
	str = str.Mid(0,index);
	int ge,shi;
	shi = atoi(temp);  ge = atoi(str);
	return shi*256 + ge;
}

void CFTPClient::List(CString dir)
{
	if(busy)
		return;
	busy = true;
	char *port0= "PASV \r\n" ;
	char *buffer = new char[1024];
	int recLen ;
	//if(dataClient == NULL)
	{
		send(mSocket,port0,(int)strlen(port0),0);
		AddMsg("设置到被动模式...");
		recLen = recv(mSocket,buffer,100,0);
		buffer[recLen]=0;
		if(GetCode(buffer) != "227")
		{
			AddMsg("设置失败!");
			AddMsg(buffer);
			delete[] buffer;
			busy = false;
			return;
		}
		AddMsg("设置成功");
		
		
		CString host1 = GetHost(buffer);
		int port1 = GetPort(buffer);
		
		dataClient = ConnectTo(host1,port1);
		if(dataClient == NULL)	
		{	
			AddMsg("数据传输连接失败!!!");
			delete[] buffer;
			busy = false;
			return;
		}
		AddMsg("连接指定的端口成功!" );
	}

	//发送List命令

	char * com = "LIST \r\n";
	int index = 0;
	send(mSocket,com,(int)strlen(com),0);

	recLen = recv(mSocket,buffer,1000,0);
	buffer[recLen] = 0;
	if(GetCode(buffer).CompareNoCase("150") == 0)
	{
		CFTPTranserDoc* pDoc = (CFTPTranserDoc*)parent->GetActiveDocument();
		if(pDoc == NULL)
		{
			delete[] buffer;
			busy = false;		
			return ;
		}
		pDoc->fileList.RemoveAll();
		recLen = recv(dataClient,buffer,1000,0);
		while(recLen > 0)
		{
			buffer[recLen+index]=0;
			CString str = GetFileInfo(buffer);
			while(str != "")
			{
				pDoc->AddFileInfo(str);
				str = GetFileInfo(buffer);
			}
			index = (int)strlen(buffer);
			recLen = recv(dataClient,buffer + index,1000-index,0);
		}
		if(parent)
		{
			CFileView * view = (CFileView *)parent->m_SplitterWnd.GetPane(0,0);
			if(view)
			{
				view->PostMessage(FILELISTMSG);
			}
		}
		if(dir == "")
		{
			recLen = recv(mSocket,buffer,1000,0);
			buffer[recLen] = 0;
			if(GetCode(buffer).CompareNoCase("226") == 0)
			{
				AddMsg("列表完成!");
			}
			else
			{
				AddMsg("列表失败!");
			}
		}
		closesocket(dataClient);
		dataClient = NULL;
	}
	else
	{
		AddMsg("列表文件失败");
		delete[] buffer;
		busy = false;
		return;
	}
	busy = false;
	delete[] buffer;

}

SOCKET CFTPClient::ConnectTo(CString host,int aPort)
{
	SOCKADDR_IN sockStruct;
	
	DWORD dwip;
	if((dwip=inet_addr(host.GetBuffer()))==INADDR_NONE) //如果是ip地址
	{
		struct hostent *hp = NULL;
		if ((hp = gethostbyname(host.GetBuffer())) != NULL)
		{
			memcpy(&(sockStruct.sin_addr), hp->h_addr, hp->h_length);
			sockStruct.sin_family = hp->h_addrtype;			
		}
		else
		{			
			WSAGetLastError();
			return false ;
		}
	}
	else
	{
		sockStruct.sin_family=AF_INET; //使用TCP/IP协议
		sockStruct.sin_addr.S_un.S_addr = dwip;
	}
	sockStruct.sin_port = htons(aPort);
	SOCKET sct = socket(PF_INET,SOCK_STREAM,0);
	if(connect(sct,(LPSOCKADDR)&sockStruct,sizeof(sockStruct)) == SOCKET_ERROR)
	{
		
		LPVOID lpMsgBuf;
		if (FormatMessage( 
			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
			FORMAT_MESSAGE_FROM_SYSTEM | 
			FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL,
			GetLastError(),
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
			(LPTSTR) &lpMsgBuf,
			0,
			NULL ))
		{
			AddMsg((char*)lpMsgBuf);

			// Free the buffer.
			LocalFree( lpMsgBuf );

		}		
		closesocket(sct);
		sct = NULL;		
		return false ;
	}
	return sct;
}
bool CFTPClient::DownLoad(FileInfo& file,CString localPath)
{
	
	busy = true;	
	char *port0= "PASV \r\n" ;
	char *buffer = new char[1025];
	int recLen ;
	
	send(mSocket,port0,(int)strlen(port0),0);
	
	recLen = recv(mSocket,buffer,100,0);
	buffer[recLen]=0;
	if(GetCode(buffer) != "227")
	{		
		delete[] buffer;
		busy = false;
		return false;
	}
	
	
	
	CString host1 = GetHost(buffer);
	int port1 = GetPort(buffer);
	
	dataClient = ConnectTo(host1,port1);
	if(dataClient == NULL)	
	{			
		delete[] buffer;
		busy = false;
		return false;
	}
	
	CString str = "RETR "+file.mName+" \r\n";
	
	send(mSocket,str.GetBuffer(),str.GetLength(),0);	
	recLen = recv(mSocket,buffer,100,0);	
	buffer[recLen]=0;

	if(GetCode(buffer) != "150")
	{		
		delete[] buffer;
		busy = false;
		return false;
	}	
	recLen = recv(dataClient,buffer,1024,0);
	while(recLen > 0 && running)
	{
		DWORD start = GetTickCount();
		recLen = recv(dataClient,buffer,1024,0);

		//应该在这里写文件,但时间紧,没有完成,

		start = GetTickCount() - start;
		parent->PostMessage(RECEIVEDATA,recLen,NULL);
		if((recLen * 8000 / speed) > start)
			Sleep(recLen * 8000 / speed);

	}
	if(recLen < 0)
	{
		delete [] buffer;
		busy = false;
		return false;
	}
	
	closesocket(dataClient);
	busy = false;
	return true;
}



⌨️ 快捷键说明

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