📄 ftpclient.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 + -