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

📄 soc.cpp

📁 socket代理的C++源码,实现了代理服务器的大部分功能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -