📄 soc.cpp
字号:
return 2;
}
if (strFile.IsEmpty() || strSave.IsEmpty())
{
return 3;
}
if (m_psocDataSrv != NULL)
{
if (m_psocDataSrv->GetSocketState())
{
m_psocDataSrv->CloseSocket();
}
}
if (m_psocDataClt != NULL)
{
if (m_psocDataClt->GetSocketState())
{
m_psocDataClt->CloseSocket();
}
}
m_bList = false;
m_bDownload = true;
m_strFileDown = strFile;
m_strFileSave = strSave;
m_unStartPos = unStart;
if (strSave.IsEmpty())
{
m_bWrite = false;
}
else
{
m_bWrite = true;
}
strCmd = "TYPE A\n\r" ;
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
strCmd.Format("SIZE %s\n\r", strFile);
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
m_bDownFileSize = true;
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 删除文件
// parameter:
// strFile 文件名称
// return: 0 正确
// date: 2006-07-20
// history:
//
//////////////////////////////////////////////////////////////////////
int CFtp::Delete(CString strFile)
{
int nSend;
CString strCmd;
BYTE *pucSend;
if (!m_bPass)
{
return 2;
}
pucSend = new BYTE[0xFF];
if (pucSend == NULL)
{
return 3;
}
strCmd = "TYPE A\n\r" ;
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
strCmd.Format("DELE %s\n\r", strFile);
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
delete [] pucSend;
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 创建目录
// parameter:
// strDir 目录名称
// return: 0 正确
// date: 2006-07-20
// history:
//
//////////////////////////////////////////////////////////////////////
int CFtp::MakeDir(CString strDir)
{
int nSend;
CString strCmd;
BYTE *pucSend;
if (!m_bPass)
{
return 2;
}
pucSend = new BYTE[0xFF];
if (pucSend == NULL)
{
return 3;
}
strCmd = "TYPE A\n\r" ;
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
strCmd.Format("MKD %s\n\r", strDir);
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
delete [] pucSend;
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 获取服务器的帮助信息,如:支持的命令的列表
// parameter:
// strParam 帮助参数
// return: 0 正确
// date: 2006-07-25
// history:
//
//////////////////////////////////////////////////////////////////////
int CFtp::Help(CString strParam)
{
int nSend;
CString strCmd;
BYTE *pucSend;
pucSend = new BYTE[0xFF];
if (pucSend == NULL)
{
return 2;
}
strCmd = "TYPE A\n\r" ;
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
strCmd.Format("HELP %s\n\r", strParam);
nSend = strCmd.GetLength();
memcpy(pucSend, strCmd.GetBuffer(), nSend);
SendCommand(pucSend, nSend);
delete [] pucSend;
return 0;
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 获取当前收到的文件数据(当收到NET_FTPDOWNDATA消息时调用)
// parameter:
// pucBuf 数据
// nLen 长度
// return: none
// date: 2006-07-22
// history:
//
//////////////////////////////////////////////////////////////////////
void CFtp::GetData( const BYTE **pucBuf, int &nLen )
{
if (m_psocDataSrv != NULL)
{
m_psocDataSrv->GetData(pucBuf, nLen);
}
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 处理服务器返回的信息的函数
// parameter:
// wParam 消息的W参数
// lParam 消息的L参数
// return: none
// date: 2006-07-22
// history:
//
//////////////////////////////////////////////////////////////////////
void CFtp::DisposeReplay(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case NET_TCPCLIENTCONNECTED:
break;
case NET_TCPCLIENTCLOSE:
{
CFtp *pftp = (CFtp*)lParam;
pftp->Close();
}
break;
case NET_TCPCLIENTRECEIVE:
{
CFtp *pftp = (CFtp*)lParam;
pftp->ReplayFtpServer();
}
break;
case NET_TCPCLIENTSEND:
break;
default:
break;
}
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 处理服务器返回的数据的函数
// parameter:
// wParam 消息的W参数
// lParam 消息的L参数
// return: none
// date: 2006-07-22
// history:
//
//////////////////////////////////////////////////////////////////////
void CFtp::DisposeData(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case NET_TCPSERVERACCEPT:
break;
case NET_TCPSERVERCLOSE:
{
SERVE_LPARAM *pInfo = (SERVE_LPARAM*)lParam;
CFtp *pftp = (CFtp*)pInfo->m_pData;
pftp->m_psocDataSrv->CloseSocket();
pftp->m_bData = false;
pftp->m_bList = false;
pftp->m_bDownload = false;
if (pftp->m_pfilDown != NULL)
{
if (pftp->m_pfilDown->m_hFile != INVALID_HANDLE_VALUE)
{
pftp->m_pfilDown->Close();
}
}
if (pftp->m_hWndMsg != NULL)
{
::SendMessage(pftp->m_hWndMsg, pftp->m_nMsg,
NET_DOWNEND, (LPARAM)pftp->m_pData);
}
if (pftp->m_pFuncMes != NULL)
{
(*pftp->m_pFuncMes)(NET_DOWNEND, (LPARAM)pftp->m_pData);
}
}
break;
case NET_TCPSERVERRECEIVE:
{
SERVE_LPARAM *pInfo = (SERVE_LPARAM*)lParam;
CFtp *pftp = (CFtp*)pInfo->m_pData;
pftp->ReadServerData(true);
}
break;
case NET_TCPSERVERSEND:
break;
case NET_TCPCLIENTCONNECTED:
break;
case NET_TCPCLIENTCLOSE:
{
CFtp *pftp = (CFtp*)lParam;
pftp->m_psocDataClt->CloseSocket();
pftp->m_bData = false;
pftp->m_bList = false;
pftp->m_bDownload = false;
if (pftp->m_pfilDown != NULL)
{
if (pftp->m_pfilDown->m_hFile != INVALID_HANDLE_VALUE)
{
pftp->m_pfilDown->Close();
}
}
if (pftp->m_hWndMsg != NULL)
{
::SendMessage(pftp->m_hWndMsg, pftp->m_nMsg,
NET_DOWNEND, (LPARAM)pftp->m_pData);
}
if (pftp->m_pFuncMes != NULL)
{
(*pftp->m_pFuncMes)(NET_DOWNEND, (LPARAM)pftp->m_pData);
}
}
break;
case NET_TCPCLIENTRECEIVE:
{
CFtp *pftp = (CFtp*)lParam;
pftp->ReadServerData(false);
}
break;
case NET_TCPCLIENTSEND:
break;
default:
break;
}
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 回复远程服务器的命令
// parameter:
// none
// return: none
// date: 2006-07-18
// history:
//
//////////////////////////////////////////////////////////////////////
void CFtp::ReplayFtpServer()
{
int nLen = 1024;
int nPrevPos = 0;
int nPos;
CString strEnter;
CString strReply;
CString strOneLine;
FTP_LPARAM uInfo;
const BYTE *pucTemp;
BYTE *pucRevData = new BYTE[1024];
if (pucRevData == NULL)
{
return;
}
strEnter.Format("%c%c", 13, 10);
m_psocCommand->GetData(&pucTemp, nLen);
memcpy(pucRevData, pucTemp, nLen);
if (nLen < 1024)
{
pucRevData[nLen] = '\0';
}
else
{
pucRevData[1023] = '\0';
}
strReply = pucRevData;
while(true)
{
nPos = strReply.Find(strEnter, nPrevPos);
if (nPos == -1)
{
if (strReply.GetLength() - nPrevPos > 0)
{
strOneLine = strReply.Mid(nPrevPos,
strReply.GetLength() - nPrevPos);
strOneLine.Trim();
if (!strOneLine.IsEmpty())
{
ReplayOneCommand(strOneLine);
}
}
break;
}
else
{
if (nPos - nPrevPos > 0)
{
strOneLine = strReply.Mid(nPrevPos, nPos - nPrevPos);
strOneLine.Trim();
if (!strOneLine.IsEmpty())
{
ReplayOneCommand(strOneLine);
}
}
nPrevPos = nPos + 2;
}
}
uInfo.m_pRecvData = pucRevData;
uInfo.m_pData = m_pData;
if (m_hWndMsg != NULL)
{
::SendMessage(m_hWndMsg, m_nMsg, NET_FTPREPLY, (LPARAM)&uInfo);
}
if (m_pFuncMes != NULL)
{
(*m_pFuncMes)(NET_FTPREPLY, (LPARAM)&uInfo);
}
delete [] pucRevData;
}
///////////////////////////////////////////////////////////////////////
//
// description:
// 处理一条回复
// parameter:
// strCmd FTP服务器回复的一条信息
// return: none
// date: 2006-07-21
// history:
//
///////////////////////////////////////////////////////////////////////
void CFtp::ReplayOneCommand(CString strCmd)
{
int nSend;
CString strCode;
BYTE pucSendData[256];
strCode = strCmd.Left(3);
if (strCode == "220")
{
if (!m_bClose && !m_bConnect)
{
m_bConnect = true;
strCmd = "USER " + m_strUser + "\n\r";
nSend = strCmd.GetLength();
memcpy(pucSendData, strCmd.GetBuffer(), nSend);
SendCommand(pucSendData, nSend);
}
}
else if (strCode == "331")
{
if (!m_bClose && !m_bUser)
{
m_bUser = true;
strCmd = "PASS " + m_strPass + "\n\r";
nSend = strCmd.GetLength();
memcpy(pucSendData, strCmd.GetBuffer(), nSend);
SendCommand(pucSendData, nSend);
}
}
else if (strCode == "230")
{
if (!m_bClose && !m_bPass)
{
m_bPass = true;
if (m_hWndMsg != NULL)
{
::SendMessage(m_hWndMsg, m_nMsg, NET_FTPLOGIN, (LPARAM)m_pData);
}
if (m_pFuncMes != NULL)
{
(*m_pFuncMes)(NET_FTPLOGIN, (LPARAM)m_pData);
}
if (m_eMode == AUTO)
{
Help("PORT");
Help("PASV");
}
else if (m_eMode == PORT)
{
m_bMode = true;
}
else if (m_eMode == PASSIVE)
{
m_bMode = false;
}
m_evtLogin.SetEvent();
}
}
else if (strCode == "214")
{
if (m_eMode == AUTO)
{
if(strCmd.Find("Command PASV is supported") >= 0)
{
m_bMode = false;
}
else if (strCmd.Find("Command PORT is supported") >= 0)
{
m_bMode = true;
}
}
}
else if (strCode == "213")
{
if (!m_bClose && m_bDownFileSize)
{
if (!strCmd.IsEmpty())
{
if (sscanf(strCmd, "213 %u", &m_unFileSize) == 1)
{
m_bDownFileSize = false;
if (m_unFileSize > 0)
{
StartDownLoad();
}
}
}
}
}
else if(strCode == "227")
{
if (!m_bClose && m_bWaitForPort)
{
int pnIP[4];
int pnPort[2];
BYTE pucIP[4];
m_bWaitForPort = false;
sscanf(strCmd, "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)",
&pnIP[0], &pnIP[1], &pnIP[2], &pnIP[3], &pnPort[0], &pnPort[1]);
if (m_psocDataClt == NULL)
{
m_psocDataClt = new CTCPClient;
if (m_psocDataClt == NULL)
{
return;
}
m_psocDataClt->SetBufferLen(0xFFFF);
m_psocDataClt->SetSocketNotify(&DisposeData);
m_psocDataClt->SetExtData(this);
}
if (m_psocDataClt->GetSocketState())
{
m_psocDataClt->CloseSocket();
}
pucIP[0] = pnIP[0];
pucIP[1] = pnIP[1];
pucIP[2] = pnIP[2];
pucIP[3] = pnIP[3];
if (m_psocDataClt->OpenSocket(pucIP, pnPort[0] * 256 + pnPort[1], 0))
{
return;
}
m_bData = true;
if (m_bList)
{
strCmd = "LIST \n\r";
nSend = strCmd.GetLength();
memcpy(pucSendData, strCmd.GetBuffer(), nSend);
SendCommand(pucSendData, nSend);
}
else if(m_bDownload)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -