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

📄 processcommand.cpp

📁 Visual Studio.net 2003 基于Socket套接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "DataStructAndConstant.h"
#include "ToolFunction.h"
#include "ProcessCommand.h"
bool ProcessUserCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData)
{
	strcpy(pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentName,pPerIOData->cBuffer.buf+5);
	if(strstr(pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentName,"anonymous")==pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentName)
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"331 User name okay, please send complete E-mail address as password.\r\n");
	
	}
	else
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"331 User name okay, need password.\r\n" );
	}
}
bool ProcessPassCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	if(strstr(pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentName,"anonymous")==pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentName)
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"230 User logged in, proceed.\r\n");
	}
	else
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"530 Not logged in.\r\n");
	}
}
bool ProcessPasvCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	USHORT usPasvPort=0;
	LPPER_SOCKET_DATA pDataSocketData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketDataBuffer);
	
	memset(pDataSocketData,0,sizeof(PER_SOCKET_DATA));
	pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.bAbor=false;
	pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData=(void*)(pDataSocketData);

	pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.bValid=false;//代表当前DATAsocket连接还没建立
	pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.pControlLinkSocketData=pPerHandleData;//给DATASOCKET对应的CTRL SOCKET 指针附值
	bool Error=false;
	
	pDataSocketData->cPerHandleData.Socket=	WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, NULL, WSA_FLAG_OVERLAPPED);
	
	if( pDataSocketData->cPerHandleData.Socket == INVALID_SOCKET)
	{
		Error=true;
	}
	else
	{
		pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.weAcceptEvent=WSACreateEvent();
		if(pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.weAcceptEvent==WSA_INVALID_EVENT)
		{
			Error=true;
		}
		else
		{
			if(WSAEventSelect( pDataSocketData->cPerHandleData.Socket,pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.weAcceptEvent, FD_ACCEPT)== SOCKET_ERROR)
			{
				Error=true;
			}
			else
			{
				SOCKADDR_IN sa;
				sa.sin_family = AF_INET;
				sa.sin_addr.S_un.S_addr = INADDR_ANY;
				sa.sin_port =0;
				int nRet= SOCKET_ERROR;
				nRet = bind(pDataSocketData->cPerHandleData.Socket, (sockaddr*)&sa, sizeof(sa));
				if(nRet == SOCKET_ERROR)
				{
					Error=true;
				}	
				else
				{
					int nNameLength=sizeof(sa);
					getsockname(pDataSocketData->cPerHandleData.Socket, (sockaddr*)&sa,&nNameLength);
					usPasvPort=ntohs(sa.sin_port);
					nRet =listen(pDataSocketData->cPerHandleData.Socket, 5);
										
					if(nRet == SOCKET_ERROR)
					{
						printf("Listen Error %d",WSAGetLastError()); 
						
						Error=true;
					}
				}
			}
		}
	}
	if(!Error)
	{
		char  strHostName[64];
		if(gethostname(strHostName,64) == SOCKET_ERROR)
		{
			return false;
		}

		//获取本地主机IP地址
		hostent * pHostIP;
		if((pHostIP = gethostbyname(strHostName)) == NULL)
		{
			return false;
		}
		char stIp[16];
		strcpy(stIp,inet_ntoa(*(in_addr *)pHostIP->h_addr_list[0]));
		for(ULONG i=0;i<strlen(stIp);i++)
		{
			if(stIp[i]=='.')
			{
				stIp[i]=',';
			}
		}
		ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"227 Entering Passive Mode (%s,%d,%d).\r\n",stIp,usPasvPort/256,(usPasvPort%256));
		
	}
	else
	{
		closesocket(pDataSocketData->cPerHandleData.Socket);
		ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"502 Command not implemented.\r\n");
	}
	if(!Error)
	{
		if(PasvAcceptFunc(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData)==0)
		{
			printf("Pasv Accept Error\r\n");   
			pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData=NULL;
		}
		else
		{
			pPerHandleData->uHandleInfo.cCtrlInfo.bBePasv=true;
			return true;
		}
	}
	return false;
}
bool ProcessPortCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	DWORD dwIpAddr=0;
	WORD wPort=0;
	char strCommand[32];
	memset(strCommand,0,32);
	strcpy(strCommand,&(pPerIOData->cBuffer.buf[5]));
	bool bError=false;
	if(SplitPortRequest(strCommand,dwIpAddr,wPort))
	{
		SOCKET soDataLinkSocket=PortConnectFunc(dwIpAddr,wPort);
		if(soDataLinkSocket==INVALID_SOCKET)
		{
			bError=true;
		}
		else
		{
			
			printf("DEBUG :Connest success! socket %d established\r\n",soDataLinkSocket);
			LPPER_SOCKET_DATA pDataSocketData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketDataBuffer);
			memset (pDataSocketData,0,sizeof(PER_SOCKET_DATA));
			pDataSocketData->cPerHandleData.enCurrentHandleType=HandleData;
			pDataSocketData->cPerHandleData.Socket=soDataLinkSocket;
			pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.bAbor=false;
			pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.bValid=true;
			pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.pControlLinkSocketData=pPerHandleData;
			pPerHandleData->uHandleInfo.cCtrlInfo.bBePasv=false;
			pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData=pDataSocketData;
			if(SetEvent(pPerHandleData->uHandleInfo.cCtrlInfo.EventDataValid)==0)
			{
				printf("Set event Error!!\r\n");
			}
			HANDLE hIOCPHandle=NULL;
			EnterCriticalSection(&AddIocpProtection);
			hIOCPHandle=CreateIoCompletionPort((HANDLE)(pDataSocketData->cPerHandleData.Socket),CompetionPort,reinterpret_cast<DWORD>(&(pDataSocketData->cPerHandleData)),0);
			LeaveCriticalSection(&AddIocpProtection);
			if ( hIOCPHandle== NULL)
			{
				printf("CreateIoCompletionPort failed with error%d\n",GetLastError());
				bError=true;
			}/**/
			
		}
			
		if(bError)
		{
			ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"502 Command not implemented.\r\n");
			return false;
		}
		else
		{
			return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"200 PORT Command successful.\r\n");
		}
	}
	else
	{
		ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"501 Syntax error in parameters or arguments.\r\n");
		return false;
	}
	return false;
}
bool ProcessAborCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	LPPER_SOCKET_DATA pDataSocketData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData);
	pDataSocketData->cPerHandleData.uHandleInfo.cDataInfo.bAbor=true;
	if(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData!=NULL)
	{
		DWORD dwWaitResult=WaitForSingleObject(pPerHandleData->uHandleInfo.cCtrlInfo.EventDataValid,10000);
		if(dwWaitResult==WAIT_TIMEOUT)
		{
			return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"226 Abort successful.\r\n");
		}
		else
		{
			return ControlNormalSendData(pPerHandleData,pPerIOData,ToAbort,"426 Data connection closed, file transfer aborted by client.\r\n");
		}
	}
	else
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"226 Abort successful.\r\n");
	}
	return false;
}
bool ProcessQuitCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	ControlNormalSendData(pPerHandleData,pPerIOData,DoNothing,"221 Goodbye.\r\n");
	return false;
}
bool ProcessSiteExecCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	char strExeName[1024];
	FormatString(&(pPerIOData->cBuffer.buf[10]));
	sprintf(strExeName,"%s" ,&(pPerIOData->cBuffer.buf[10]));
	int nResult=WinExec(strExeName,SW_SHOW);
	if(nResult<=31)
	{
		char strExePathName[1024];
		strcpy(strExePathName,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
		if(strExePathName[strlen(strExePathName)-1]!='/')
		{
			strcat(strExePathName,"/");
		}

		sprintf(strExeName,"\"%s%s\" -L -S",strExePathName,&(pPerIOData->cBuffer.buf[10]));
		
		nResult=WinExec(strExeName,SW_SHOW);
	}
	printf("DEBUG :Exec %s Resurt %d \r\n" ,strExeName,nResult);
	if(nResult>31)
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"200 EXEC command successful (TID=%d).\r\n",nResult);
	}
	else
	{
		ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"501 Cannot EXEC command line .\r\n");
	}
	return false;
}
bool ProcessRestCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	DWORD dwRestPosition=atoi(&(pPerIOData->cBuffer.buf[5]));
	pPerHandleData->uHandleInfo.cCtrlInfo.dwDataResetPosition=dwRestPosition;
	return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"350 Restarting at %d. Send STORE or RETRIEVE\r\n",dwRestPosition);
}
bool ProcessPwdCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"257 \"%s\" is current directory.\r\n",pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath);
	return false;
}
bool ProcessListCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	memset(pPerIOData,0,sizeof(PER_IO_OPERATION_DATA));
	pPerIOData->cBuffer.buf=pPerIOData->stBuffer;
	pPerIOData->IoType=ControlIoSend;
	DWORD dwNumberOfDataSended=0;
	bool ReturnValue=false;
	if(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData!=NULL)
	{
		char *strSendDataBuffer=((LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData))->cPerIoData.stBuffer;
		ULONG dwDataSize=StorFileList(strSendDataBuffer,BUFFERSIZE,pPerHandleData->uHandleInfo.cCtrlInfo.strCurrentWorkPath,true);
		TRANSMIT_PACKETS_ELEMENT cTransmitData;
		cTransmitData.dwElFlags=TP_ELEMENT_MEMORY;
		cTransmitData.cLength=dwDataSize;
		cTransmitData.pBuffer=strSendDataBuffer;
		pPerIOData->uIoInfo.cControlIoSendInfo.enNextToDo=ToSendData;
		memcpy(pPerIOData->uIoInfo.cControlIoSendInfo.bWhatToDo,&cTransmitData,sizeof(cTransmitData));
		if(pPerHandleData->uHandleInfo.cCtrlInfo.bBePasv)
		{
			sprintf(pPerIOData->stBuffer,"150 Opening ASCII mode data connection for /bin/ls.\r\n");
		}
		else
		{
			sprintf(pPerIOData->stBuffer,"125 Data connection already open; Transfer starting.\r\n");
		}
		ReturnValue=true;
	}
	else
	{
		pPerIOData->uIoInfo.cControlIoSendInfo.enNextToDo=ToReceive;
		sprintf(pPerIOData->stBuffer,"425 Can't open data connection.\r\n");
	}
	pPerIOData->cBuffer.len=(DWORD)strlen(pPerIOData->cBuffer.buf);
	pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength=0;	
	if(WSASend(pPerHandleData->Socket,&(pPerIOData->cBuffer),1,&(dwNumberOfDataSended),0,&(pPerIOData->Overlapped),NULL) ==SOCKET_ERROR ) 
	{ 
		if (WSAGetLastError() != ERROR_IO_PENDING) 
		{ 
			printf("WSASend() fialed with error %d\n",WSAGetLastError()); 
			return false;
		} 
		else
		{
			return ReturnValue;
		}
	} 
	return false;
}
bool ProcessTypeCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	char strCmd[32];
	strcpy(strCmd,pPerIOData->cBuffer.buf);
	if(strstr(strCmd,"a")!=NULL)
	{
		return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"200 Type set to A.\r\n");
	}
	else
	{
		if(strstr(strCmd,"i")!=NULL)
		{
			return ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"200 Type set to I.\r\n");
		}
		else
		{
			ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"504 Command not implemented for that parameter.\r\n");
		}
	}
	return false;
}
bool ProcessCwdCommand(DWORD dwBytesTransferred,LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pPerIOData) 
{
	char strNewPath[1024];
	strcpy(strNewPath,&(pPerIOData->cBuffer.buf[4]));
	FormatString(strNewPath);
	if(strNewPath[strlen(strNewPath)-1]==':')
	{
		strcat(strNewPath,"\\");
	}
	if(chdir(strNewPath)==0)//success
	{

⌨️ 快捷键说明

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