亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? connectsocket.cpp

?? 用套接字實現的ftp文件傳輸源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/********************************************************************/
/*																	*/
/*  CONNECTSOCKET.CPP												*/
/*																	*/
/*  Implementation of the Connect Socket.							*/
/*	This class is a part of the CConnectThread which handles		*/
/*  socket connections. Incomming data is processed in OnReceive	*/
/*																	*/
/*  Programmed by Pablo van der Meer								*/
/*  Based partially on and inspired by FileZilla Server.			*/
/*																	*/
/*	http://www.pablovandermeer.nl									*/
/*																	*/
/*  Last updated: 15 july 2002										*/
/*																	*/
/********************************************************************/
//在ConnectSocket.cpp文件中實現連接套接字的創建,該類是CConnectThread類的
//一部分,收到數據由函數OnReceive()完成處理。

#include "stdafx.h"
#include "FTPServerApp.h"
#include "FTPServer.h"
#include "ConnectSocket.h"
#include "ConnectThread.h"
#include "ApplicationDlg.h"
#include "DataSocket.h"

extern CFTPServer theServer;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/********************************************************************/
/*																	*/
/* Function name : CConnectSocket::CConnectSocket					*/
/* Description   : Constructor										*/
/*																	*/
/********************************************************************/
CConnectSocket::CConnectSocket()
{
	m_bLoggedon = FALSE;
	m_bRenameFile = FALSE;
	m_pDataSocket = NULL;
	m_strRemoteHost = "";
	m_nRemotePort = -1;
	m_dwRestartOffset = 0;
	m_bPassiveMode = FALSE;
}


/********************************************************************/
/*																	*/
/* Function name : CConnectSocket::~CConnectSocket					*/
/* Description   : Destructor										*/
/*																	*/
/********************************************************************/
CConnectSocket::~CConnectSocket()
{
	DestroyDataConnection();

	// tell our thread we have been closed
	AfxGetThread()->PostThreadMessage(WM_QUIT,0,0);

	TRACE0("CConnectSocket destroyed.\n");
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CConnectSocket, CSocket)
	//{{AFX_MSG_MAP(CConnectSocket)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0


/********************************************************************/
/*																	*/
/* Function name : OnClose											*/		
/* Description   : Send WM_QUIT message to the thread containing	*/
/*				   the socket to shutdown once the connection is	*/
/*                 closed.											*/
/*																	*/
/********************************************************************/
void CConnectSocket::OnClose(int nErrorCode) 
{
	Close();
	// destroy connection
	m_pThread->PostThreadMessage(WM_THREADMSG, 1, 0);
	TRACE("CConnectSocket() OnClose()\n");

	CSocket::OnClose(nErrorCode);
}


#define BUFFERSIZE 4096

/********************************************************************/
/*																	*/
/* Function name : OnReceive										*/		
/* Description   : Called by the framework to notify this socket	*/
/*                 that there is data in the buffer.				*/
/*																	*/
/********************************************************************/
//由主窗口調用通知套接字緩沖區中有數據要接收
void CConnectSocket::OnReceive(int nErrorCode) 
{
	TCHAR buff[BUFFERSIZE];
	//接收數據并放到緩沖區
	int nRead = Receive(buff, BUFFERSIZE);
	switch (nRead)
	{
		case 0:
			Close();
			break;

		case SOCKET_ERROR:
			if (GetLastError() != WSAEWOULDBLOCK) 
			{
				TCHAR szError[256];
				wsprintf(szError, "OnReceive error: %d", GetLastError());
				
				AfxMessageBox (szError);
			}
			break;

		default:
			if (nRead != SOCKET_ERROR && nRead != 0)
			{
				((CConnectThread *)AfxGetThread())->IncReceivedBytes(nRead);

				// 結束字符串
				buff[nRead] = 0; 
				m_RxBuffer += CString(buff);
			    //獲得命令行
				GetRxLine();
			}	
			break;
	}
	CSocket::OnReceive(nErrorCode);
}


/********************************************************************/
/*																	*/
/* Function name: GetRxCommand										*/		
/* Description  : Get command from receiver buffer.					*/
/*																	*/
/********************************************************************/
//從接收緩沖區獲得命令
BOOL CConnectSocket::GetRxCommand(CString &strCommand, CString &strArguments)
{
	if (!m_strCommands.IsEmpty())
	{
		CString strBuff = m_strCommands.RemoveHead();
		int nIndex = strBuff.Find(" ");
		if (nIndex != -1)
		{
			CString strPassword = strBuff;
			strPassword.MakeUpper();
			//使密碼不可見
			if (strPassword.Left(5) == "PASS ")
			{
				for (int i=5; i < strPassword.GetLength(); i++)
				{
					strPassword.SetAt(i, '*');
				}
				FireStatusMessage(strPassword, 1);
			}
			else
			{
				FireStatusMessage(strBuff, 1);
			}
			strCommand = strBuff.Left(nIndex);
			strArguments = strBuff.Mid(nIndex+1);
		}
		else
		{
			FireStatusMessage(strBuff, 1);
			strCommand = strBuff;
		}

		if (strCommand != "")
		{
			strCommand.MakeUpper();

			// who screwed up ???
			if (strCommand.Right(4) == "ABOR")
			{
				strCommand = "ABOR";
			}
			
			TRACE2("COMMAND: %s, ARGS: %s\n", strCommand, strArguments);
			return TRUE;
		}
	}
	return FALSE;
}


/********************************************************************/
/*																	*/
/* Function name: GetRxLine											*/		
/* Description  : Parse complete command line						*/
/*																	*/
/********************************************************************/
//解析整個命令行
void CConnectSocket::GetRxLine()
{
	CString strTemp;
	int nIndex;

	while(!m_RxBuffer.IsEmpty())
	{
		//尋找換行符
		nIndex = m_RxBuffer.Find("\r\n");
		if (nIndex != -1)
		{
			strTemp = m_RxBuffer.Left(nIndex);
			m_RxBuffer = m_RxBuffer.Mid(nIndex + 2);
			if (!strTemp.IsEmpty())
			{
				m_strCommands.AddTail(strTemp);
				// 解析并執行命令
				ParseCommand();
			}
		}
		else
			break;
	}
}


/********************************************************************/
/*																	*/
/* Function name: OnConnect											*/		
/* Description  : Called by the framework to notify this connecting	*/
/*				  socket that its connection attempt is completed.  */
/*																	*/
/********************************************************************/
void CConnectSocket::OnConnect(int nErrorCode) 
{
	CSocket::OnConnect(nErrorCode);
}


/********************************************************************/
/*																	*/
/* Function name: HasConnectionDropped								*/		
/* Description  : Check if connection has been dropped.				*/
/*				  Used to detect if client has crashed.				*/
/*																	*/
/********************************************************************/
BOOL CConnectSocket::HasConnectionDropped(void)
{
	BOOL bConnDropped = FALSE;
	INT iRet = 0;
	BOOL bOK = TRUE;
	
	if (m_hSocket == INVALID_SOCKET)
		return TRUE;

	struct timeval timeout = { 0, 0 };
	fd_set readSocketSet;
	
	FD_ZERO(&readSocketSet);
	FD_SET(m_hSocket, &readSocketSet);
	
	iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
	bOK = (iRet > 0);
	
	if(bOK)
	{
		bOK = FD_ISSET(m_hSocket, &readSocketSet);
	}
	
	if(bOK)
	{
		CHAR szBuffer[1] = "";
		iRet = ::recv(m_hSocket, szBuffer, 1, MSG_PEEK);
		bOK = (iRet > 0);
		if(!bOK)
		{
			INT iError = ::WSAGetLastError();
			bConnDropped = (( iError == WSAENETRESET) ||
				(iError == WSAECONNABORTED) ||
				(iError == WSAECONNRESET) ||
				(iError == WSAEINVAL) ||
				(iRet == 0));
		}
	}
    return(bConnDropped);
}


/********************************************************************/
/*																	*/
/* Function name: SendResponse										*/		
/* Description  : Send response to client.							*/
/*																	*/
/********************************************************************/
//發送響應給客戶端
BOOL CConnectSocket::SendResponse(LPCTSTR pstrFormat, ...)
{
	CString str;

	// 格式化參數
	va_list args;
	va_start(args, pstrFormat);
	str.FormatV(pstrFormat, args);

	//判斷連接是否在活動狀態
	if (HasConnectionDropped())
	{
		FireStatusMessage("Could not send reply, disconnected.", 2);	

		Close();
		// 通知線程已經停止,關閉連接
		m_pThread->PostThreadMessage(WM_THREADMSG, 1, 0);
		return FALSE;
	}

	int nBytes = CSocket::Send(str + "\r\n", str.GetLength()+2);
	if (nBytes == SOCKET_ERROR)
	{
		Close();
		FireStatusMessage("Could not send reply, disconnected.", 2);	

		//通知線程連接已經關閉
		m_pThread->PostThreadMessage(WM_THREADMSG, 1, 0);

		return FALSE;
	}

	FireStatusMessage(str, 2);

	((CConnectThread *)AfxGetThread())->IncSentBytes(nBytes);
	return TRUE;
}


/********************************************************************/
/*																	*/
/* Function name: ParseCommand										*/		
/* Description  : Parse and execute command from client.			*/
/*																	*/
/* Based on code provided by FileZilla Server.						*/
/* http://sourceforge.net/projects/filezilla						*/
/*																	*/
/********************************************************************/
//從客戶端解析并執行命令
void CConnectSocket::ParseCommand()
{
	//命令列表
	static CFTPCommand commandList[] = 
	{
		{TOK_ABOR,	"ABOR", FALSE,	"Abort transfer: ABOR"}, 
		{TOK_BYE,	"BYE",  FALSE,	"Logout or break the connection: BYE"},
		{TOK_CDUP,	"CDUP", FALSE,	"Change to parent directory: CDUP"},
		{TOK_CWD,	"CWD",	TRUE,	"Change working directory: CWD [directory-name]"},
		{TOK_DELE,	"DELE", TRUE ,	"Delete file: DELE file-name"},
		{TOK_DIR,	"DIR",  FALSE,	"Get directory listing: DIR [path-name]"},
		{TOK_HELP,	"HELP",  FALSE, "Show help: HELP [command]"},
		{TOK_LIST,	"LIST", FALSE,	"Get directory listing: LIST [path-name]"}, 
		{TOK_MKD,	"MKD",	TRUE,	"Make directory: MKD path-name"},
		{TOK_NOOP,	"NOOP", FALSE,	"Do nothing: NOOP"},
		{TOK_PASS,	"PASS", TRUE,	"Supply a user password: PASS password"},
		{TOK_PASV,	"PASV", FALSE,	"Set server in passive mode: PASV"},
		{TOK_PORT,	"PORT", TRUE,	"Specify the client port number: PORT a0,a1,a2,a3,a4,a5"},
		{TOK_PWD,	"PWD",	FALSE,	"Get current directory: PWD"},
		{TOK_QUIT,	"QUIT",  FALSE,	"Logout or break the connection: QUIT"},
		{TOK_REST,	"REST", TRUE,	"Set restart transfer marker: REST marker"},
		{TOK_RETR,	"RETR", TRUE,	"Get file: RETR file-name"},
		{TOK_RMD,	"RMD",	TRUE,	"Remove directory: RMD path-name"},
		{TOK_RNFR,	"RNFR", TRUE,	"Specify old path name of file to be renamed: RNFR file-name"},
		{TOK_RNTO,	"RNTO", TRUE,	"Specify new path name of file to be renamed: RNTO file-name"},
		{TOK_SIZE,	"SIZE", TRUE,	"Get filesize: SIZE file-name"},
		{TOK_STOR,	"STOR", TRUE,	"Store file: STOR file-name"},
		{TOK_SYST,	"SYST", FALSE,	"Get operating system type: SYST"},
		{TOK_TYPE,	"TYPE", TRUE,	"Set filetype: TYPE [A | I]"},
		{TOK_USER,	"USER", TRUE,	"Supply a username: USER username"},
		{TOK_ERROR,	"",		FALSE,  ""},
	};
	
	// 解析命令
	CString strCommand, strArguments;
	if (!GetRxCommand(strCommand, strArguments))
	{
		return;
	}

	int nCommand;

	//在命令列表中查找命令
	for (nCommand = TOK_ABOR; nCommand < TOK_ERROR; nCommand++)
	{
		// 判斷是否找到命令
		if (strCommand == commandList[nCommand].m_pszName)
		{
			if (commandList[nCommand].m_bHasArguments && (strArguments.IsEmpty()))
			{
				SendResponse("501 Syntax error: Invalid number of parameters.");
				return;
			}
			break;			
		}
	}

	if (nCommand == TOK_ERROR)
	{
		// 命令不在我們的列表中
		SendResponse("501 Syntax error: Command not understood.");
		return;
	}
	
	//判斷是否成功登錄服務器
	if ((nCommand != TOK_USER && nCommand != TOK_PASS) && !m_bLoggedon)
	{
		SendResponse("530 Please login with USER and PASS.");
		return;
	}

	// 處理命令
	switch(nCommand)
	{
		//指定用戶名
		case TOK_USER:
		{
			strArguments.MakeLower();
			m_bLoggedon = FALSE;
			m_strUserName = strArguments;

			CString strPeerAddress;
			UINT nPeerPort;
			//獲得客戶端IP地址和端口
			GetPeerName(strPeerAddress, nPeerPort);

			// 通知FTP服務器一個新的用戶已經連接
			CConnectThread *pThread = (CConnectThread *)m_pThread;
			((CFTPServer *)pThread->m_pWndServer)->m_pEventSink->OnFTPUserConnected(m_pThread->m_nThreadID, m_strUserName, strPeerAddress);

			SendResponse("331 User name ok, need password.");
		}
		break;

		// 指定密碼
		case TOK_PASS:
		{
			//判斷是否登錄成功
			if (m_bLoggedon)
			{
				SendResponse("503 Login with USER first.");
			}
			else
			{
				// 用用戶名和密碼登錄客戶端
				CUser user;
				// 檢查用戶名
				if (theServer.m_UserManager.GetUser(m_strUserName, user))
				{
					// 檢查密碼
					if ((!user.m_strPassword.Compare(strArguments) || user.m_strPassword.IsEmpty()) && !user.m_bAccountDisabled)
					{
						// 設置用戶路徑
						m_strCurrentDir = "/";

						// 成功登錄
						m_bLoggedon = TRUE;
						SendResponse("230 User successfully logged in.");
						break;
					}
				}
				SendResponse("530 Not logged in, user or password incorrect!");
			}
		}
		break;
		
		// 改變傳輸模式
		case TOK_TYPE:
		{
			SendResponse("200 Type set to %s", strArguments);
		}
		break;

		//打印當前路徑
		case TOK_PWD:
		{
			SendResponse("257 \"%s\" is current directory.", m_strCurrentDir);
		}
		break;

		// 改變上層目錄
		case TOK_CDUP:
			strArguments = "..";
		// 改變工作目錄
		case TOK_CWD:
		{
			//改變到指定目錄
			int nResult = theServer.m_UserManager.ChangeDirectory(m_strUserName, m_strCurrentDir, strArguments);
			switch(nResult)
			{
				case 0:
					SendResponse("250 CWD command successful. \"%s\" is current directory.", m_strCurrentDir);
					break;
				case 1:
					SendResponse("550 CWD command failed. \"%s\": Permission denied.", strArguments);
					break;
				default:
					SendResponse("550 CWD command failed. \"%s\": Directory not found.", strArguments);
					break;
			}
		}
		break; 

		// 指定IP地址和端口
		case TOK_PORT:
		{
			CString strSub;
			int nCount=0;

			while (AfxExtractSubString(strSub, strArguments, nCount++, ','))
			{
				switch(nCount)
				{
					case 1:	
						m_strRemoteHost = strSub;
						m_strRemoteHost += ".";
						break;
					case 2:	
						m_strRemoteHost += strSub;
						m_strRemoteHost += ".";
						break;
					case 3:	
						m_strRemoteHost += strSub;
						m_strRemoteHost += ".";
						break;
					case 4:	
						m_strRemoteHost += strSub;
						break;
					case 5:	
						m_nRemotePort = 256*atoi(strSub);
						break;
					case 6:	
						m_nRemotePort += atoi(strSub);
						break;
				}
			}
			m_bPassiveMode = FALSE;
			SendResponse("200 Port command successful.");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二| 欧美三级在线播放| 国产69精品久久久久毛片| 欧美日韩一级片网站| 精品国产乱码久久久久久久| 一区在线观看视频| 韩国理伦片一区二区三区在线播放| 欧美在线一区二区三区| 亚洲国产精品二十页| 久久精品免费观看| 欧美日韩大陆在线| 亚洲一区视频在线| 国内久久婷婷综合| 精品视频全国免费看| 国产精品久久久久久久久动漫 | 国产精品系列在线观看| 欧美疯狂性受xxxxx喷水图片| 亚洲精品成人少妇| 99精品桃花视频在线观看| 久久男人中文字幕资源站| 久久精品久久久精品美女| 欧美精品在线视频| 亚洲成人综合网站| 欧美性做爰猛烈叫床潮| 亚洲卡通欧美制服中文| 91丨porny丨蝌蚪视频| 中文字幕国产一区| k8久久久一区二区三区| 中文字幕一区二区三区在线观看 | 美女视频黄 久久| 欧美日精品一区视频| 亚洲成人激情自拍| 日韩精品一区二区三区中文精品| 亚洲福利视频导航| 91激情在线视频| 亚洲三级在线免费| 99国产欧美另类久久久精品| 国产精品污www在线观看| 国产成人精品免费| 亚洲国产高清不卡| 91看片淫黄大片一级在线观看| 中文字幕中文字幕一区二区 | 97久久精品人人做人人爽| 亚洲国产电影在线观看| 色综合一个色综合| 亚洲国产一二三| 欧美老女人在线| 玖玖九九国产精品| 国产视频911| 91日韩在线专区| 日韩精品乱码免费| 久久久久九九视频| 一本到高清视频免费精品| 亚洲va国产天堂va久久en| 日韩欧美国产午夜精品| 成人精品视频.| 亚洲在线中文字幕| 精品久久久久久最新网址| 成人永久aaa| 亚洲大尺度视频在线观看| 欧美变态口味重另类| 波多野结衣一区二区三区| 亚洲电影第三页| 久久众筹精品私拍模特| 91原创在线视频| 日本亚洲最大的色成网站www| 午夜精品一区二区三区三上悠亚| 蜜桃视频一区二区三区| 久久综合资源网| 国产成都精品91一区二区三| 亚洲一区在线观看网站| 久久亚洲捆绑美女| 色呦呦日韩精品| 国产在线精品不卡| 亚洲欧美精品午睡沙发| 欧美大度的电影原声| 91浏览器打开| 国产麻豆午夜三级精品| 污片在线观看一区二区| 国产精品高潮久久久久无| 欧美精品高清视频| 一本到不卡精品视频在线观看| 日日摸夜夜添夜夜添精品视频| 国产精品国产三级国产a| 日韩视频一区在线观看| 91电影在线观看| 国产成人av电影在线| 麻豆91精品视频| 亚洲国产视频在线| 亚洲欧洲精品成人久久奇米网| 久久一区二区三区国产精品| 欧美日本一区二区在线观看| av毛片久久久久**hd| 国产成人在线影院| 国产在线精品免费av| 久久国产免费看| 日韩成人一级大片| 亚洲欧美激情在线| 亚洲色欲色欲www| 国产精品亲子伦对白| 久久久久久久久免费| 精品国产乱子伦一区| 91精品国产综合久久福利| 欧美自拍偷拍一区| 91久久一区二区| 日本精品一区二区三区高清| 色综合中文字幕国产 | 欧美韩国一区二区| 久久免费精品国产久精品久久久久| 欧美日韩国产乱码电影| 欧美少妇一区二区| 欧美日韩三级一区| 欧美日韩一区久久| 欧美日韩国产高清一区二区| 欧美伊人久久久久久久久影院| 91亚洲精品久久久蜜桃网站| eeuss鲁一区二区三区| 99久久99久久综合| aaa欧美日韩| 日本高清视频一区二区| 在线免费观看日本一区| 欧美性高清videossexo| 欧美日韩国产在线播放网站| 91精品欧美福利在线观看| 欧美一级艳片视频免费观看| 欧美成人a∨高清免费观看| 精品国产乱码久久久久久蜜臀 | 日韩欧美在线一区二区三区| 欧美一区二区三区免费在线看| 91精品国产全国免费观看 | 制服丝袜在线91| 欧美一级久久久| 久久久精品国产免费观看同学| 国产女同互慰高潮91漫画| 亚洲私人黄色宅男| 亚洲一区二区三区视频在线| 秋霞av亚洲一区二区三| 国内国产精品久久| 不卡电影一区二区三区| 欧洲一区二区三区在线| 日韩欧美国产精品| 中文字幕巨乱亚洲| 亚洲成人综合视频| 国产精品一二二区| 在线观看不卡一区| 精品三级在线看| 综合网在线视频| 青青国产91久久久久久| 成人精品小蝌蚪| 欧美人狂配大交3d怪物一区| 2欧美一区二区三区在线观看视频| 国产精品久久国产精麻豆99网站| 亚洲第一久久影院| 国产福利91精品| 欧美日韩另类一区| 国产精品色哟哟| 美女视频黄频大全不卡视频在线播放 | 国产.欧美.日韩| 欧美精品在线观看播放| 国产精品美女久久久久久久久久久| 亚洲综合男人的天堂| 国产精品一区二区x88av| 欧美日韩一区成人| 亚洲欧洲精品成人久久奇米网| 久久国产尿小便嘘嘘| 欧洲一区二区三区免费视频| 国产欧美一区二区精品性色超碰| 亚洲成a人v欧美综合天堂| 不卡的看片网站| 久久综合久久鬼色| 午夜精品一区在线观看| 色综合天天综合网天天看片| 久久久五月婷婷| 久久国产婷婷国产香蕉| 欧美欧美午夜aⅴ在线观看| 亚洲图片欧美激情| 国产高清不卡二三区| 日韩欧美中文字幕一区| 婷婷一区二区三区| 欧美视频三区在线播放| 亚洲六月丁香色婷婷综合久久 | 91黄色免费看| 日本一区二区三区电影| 国产一区在线观看麻豆| 欧美一区二区久久久| 亚洲超碰精品一区二区| 欧美亚洲动漫另类| 亚洲精品你懂的| 99在线精品观看| 中文字幕的久久| 成人免费视频app| 欧美激情一区在线观看| 成人性生交大合| 国产精品乱人伦中文| 波多野结衣中文字幕一区二区三区| 日韩1区2区日韩1区2区| 欧美变态凌虐bdsm| 日韩专区在线视频| 一本大道av一区二区在线播放| 久久久777精品电影网影网|