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

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

?? ftpcommandprocessor.cpp

?? 配套《網絡通信編程實用案例精選》源代碼。
?? CPP
字號:
/*/////////////////////////////////////////////////////////////////////
FTPclient.cpp (c) GDI 1999
V1.0.0 (10/4/99)
Phil Anderson. philip@gd-ind.com

Simple FTP client functionality. If you have any problems with it,
please tell me about them (or better still e-mail me the fixed
code). Please feel free to use this code however you wish, although
if you make changes please put your name in the source & comment what
you did.

Nothing awesome going on here at all (all sockets are used in
synchronous blocking mode), but it does the following
things WinInet doesn't seem to:
* Supports loads of different firewalls (I think, I don't
  have access to all types so they haven't all been fully
  tested yet)
* Allows you to execute any command on the FTP server
* Adds 10K to your app install rather than 1Mb #;-)

Functions return TRUE if everything went OK, FALSE if there was an,
error. A message describing the outcome (normally the one returned
from the server) will be in m_retmsg on return from the function.
There are a few error msgs in the app's string table that you'll
need to paste into your app, along with this file & FTPclient.h

If you created your app without checking the "Use Windows Sockets"
checkbox in AppWizard, you'll need to add the following bit of code
to you app's InitInstance()

if(!AfxSocketInit())
{
	AfxMessageBox("Could not initialize Windows Sockets!");
	return FALSE;
}

To use:

1/ Create an object of CFTPCommandProcessor.

2/ Use LogOnToServer() to connect to the server. Any arguments
not used (e.g. if you're not using a firewall), pass an empty
string or zero for numeric args. You must pass a server port
number, use the FTP default of 21 if you don't know what it is.

3/ Use MoveFile() to upload/download a file, 1st arg is local file
path, 2nd arg is remote file path, 3rd arg is TRUE for a PASV
connection (required by some firewalls), FALSE otherwise, 4th arg
is TRUE to upload, FALSE to download file. MoveFile only works in
synchronous mode (ie the function will not return 'till the transfer
is finished). File transfers are always of type BINARY.

4/ You can use FTPcommand() to execute FTP commands (eg
FTPcommand("CWD /home/mydir") to change directory on the server),
note that this function will return FALSE unless the server response
is a 200 series code. This should work fine for most FTP commands, 
otherwise you can use WriteStr() and ReadStr() to send commands & 
interpret the response yourself. Use LogOffServer() to disconnect
when done.

/////////////////////////////////////////////////////////////////////*/


#include "stdafx.h"
#include "MyFTPClient.h"
#include "FTPCommandProcessor.h"


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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//構造函數,變量初始化
CFTPCommandProcessor::CFTPCommandProcessor()
{
	m_pCtrlsokfile=NULL;
	m_pCtrlTxarch=NULL;
	m_pCtrlRxarch=NULL;
	m_Ctrlsok=NULL;
}


CFTPCommandProcessor::~CFTPCommandProcessor()
{
	CloseControlChannel();
}


//////////////////////////////////////////////////////////////////////
// Public Functions
//////////////////////////////////////////////////////////////////////


// 登錄到服務器
BOOL CFTPCommandProcessor::LogOnToServer(CString hostname,int hostport,CString username, CString password, CString acct, CString fwhost,CString fwusername, CString fwpassword,int fwport,int logontype) 
{
	int port,logonpoint=0;
	const int LO=-2, ER=-1;
	CString buf,temp;
	const int NUMLOGIN=9; // 支持9種不同的登錄方式
	int logonseq[NUMLOGIN][100] = {
		// 下面的數組保存了針對不同防火墻的登錄序列
		{0,LO,3, 1,LO,6, 2,LO,ER}, // 沒有防火墻
		{3,6,3, 4,6,ER, 5,ER,9, 0,LO,12, 1,LO,15, 2,LO,ER}, // 主機名
		{3,6,3, 4,6,ER, 6,LO,9, 1,LO,12, 2,LO,ER}, // USER after logon
		{7,3,3, 0,LO,6, 1,LO,9, 2,LO,ER}, //proxy OPEN
		{3,6,3, 4,6,ER, 0,LO,9, 1,LO,12, 2,LO,ER}, // Transparent
		{6,LO,3, 1,LO,6, 2,LO,ER}, // USER with no logon
		{8,6,3, 4,6,ER, 0,LO,9, 1,LO,12, 2,LO,ER}, //USER fireID@remotehost
		{9,ER,3, 1,LO,6, 2,LO,ER}, //USER remoteID@remotehost fireID
		{10,LO,3, 11,LO,6, 2,LO,ER} // USER remoteID@fireID@remotehost
	};

	if(logontype<0||logontype>=NUMLOGIN) return FALSE; // illegal connect code
	if(!logontype) {
		temp=hostname;
		port=hostport;
	}
	else {
		temp=fwhost;
		port=fwport;
	}
	if(hostport!=21) hostname.Format(hostname+":%d",hostport); // 如果端口不是默認端口21,則設定端口
	if(!OpenControlChannel(temp,port)) return false;
	if(!FTPcommand("")) return FALSE; // 獲得連接服務器初始化信息
	// 獲得登錄類型
	while(1) {
		switch(logonseq[logontype][logonpoint]) {
		case 0:
			temp="USER "+username;
			break;
		case 1:
			temp="PASS "+password;
			break;
		case 2:
			temp="ACCT "+acct;
			break;
		case 3:
			temp="USER "+fwusername;
			break;
		case 4:
			temp="PASS "+fwpassword;
			break;
		case 5:
			temp="SITE "+hostname;
			break;
		case 6:
			temp="USER "+username+"@"+hostname;
			break;
		case 7:
			temp="OPEN "+hostname;
			break;
		case 8:
			temp="USER "+fwusername+"@"+hostname;
			break;
		case 9:
			temp="USER "+username+"@"+hostname+" "+fwusername;
			break;
		case 10:
			temp="USER "+username+"@"+fwusername+"@"+hostname;
			break;
		case 11:
			temp="PASS "+password+"@"+fwpassword;
			break;
		}
		// 發出命令,獲得響應
		if(!WriteStr(temp)) return FALSE;
		if(!ReadStr()) return FALSE;
		// 只有這些響應是合法的
		if(m_fc!=2&&m_fc!=3) return FALSE;
		logonpoint=logonseq[logontype][logonpoint+m_fc-1]; //get next command from array
		switch(logonpoint) {
		case ER: // 出現錯誤
			m_retmsg.LoadString(IDS_FTPMSG1);
			return FALSE;
		case LO: // L0表示成功登錄
			return TRUE;
		}
	}
}


// 退出服務器
void CFTPCommandProcessor::LogOffServer() {
	WriteStr("QUIT");
	CloseControlChannel();
}


// 發送命令到服務器
BOOL CFTPCommandProcessor::FTPcommand(CString command) {
	if(command!=""&&!WriteStr(command)) return FALSE;
	if((!ReadStr())||(m_fc!=2)) return FALSE;
	return TRUE;
}


// 上載或者下載文件
BOOL CFTPCommandProcessor::MoveFile(CString remotefile, CString localfile,BOOL pasv,BOOL get) 
{
	CString lhost,temp,rhost;
	UINT localsock,serversock,i,j;
	CFile datafile;
	CSocket sockSrvr;
	CAsyncSocket datachannel;
	int num,numread,numsent;
	const int BUFSIZE=4096;
	char cbuf[BUFSIZE];
	DWORD lpArgument=0;
	
	// 打開本地文件
	if(!datafile.Open(localfile,(get?CFile::modeWrite|CFile::modeCreate:CFile::modeRead))) {
		m_retmsg.LoadString(IDS_FTPMSG4);
		return FALSE;
	}
	if(!FTPcommand("TYPE I")) return FALSE; // 請求二進制傳輸
	if(pasv) { // 建立被動傳輸方式
		if(!FTPcommand("PASV")) return FALSE;
		// 分析出服務器傳回的臨時IP地址以及端口號
		if((i=m_retmsg.Find("("))==-1||(j=m_retmsg.Find(")"))==-1) return FALSE;
		temp=m_retmsg.Mid(i+1,(j-i)-1);
		i=temp.ReverseFind(',');
		serversock=atol(temp.Right(temp.GetLength()-(i+1))); //get ls byte of server socket
		temp=temp.Left(i);
		i=temp.ReverseFind(',');
		serversock+=256*atol(temp.Right(temp.GetLength()-(i+1))); // add ms byte to server socket
		rhost=temp.Left(i);
		while(1) { // 將逗號轉化成點
			if((i=rhost.Find(","))==-1) break;
			rhost.SetAt(i,'.');
		}
	}
	else { // 設置主動的傳輸模式
		m_retmsg.LoadString(IDS_FTPMSG6);
		//獲取本地的ip地址,發送到服務器
		if(!m_Ctrlsok->GetSockName(lhost,localsock)) return FALSE;;
		while(1) { // 將IP地址中的點轉化成逗號
			if((i=lhost.Find("."))==-1) break;
			lhost.SetAt(i,',');
		}
		// 創建本地偵聽進程
		if((!sockSrvr.Create(0,SOCK_STREAM,NULL))||(!sockSrvr.Listen())) return FALSE;
		if(!sockSrvr.GetSockName(temp,localsock)) return FALSE;// get the port that MFC chose
		// 將端口轉化成2字節,然后加入到本地IP地址中
		lhost.Format(lhost+",%d,%d",localsock/256,localsock%256);
		if(!FTPcommand("PORT "+lhost)) return FALSE;// 發送端口到服務器
	}
	// 發送 RETR/STOR 命令到服務器
	if(!WriteStr((get?"RETR ":"STOR ")+remotefile)) return FALSE;
	if(pasv) {// 如果是PASV模式,則創建socket并初始化外部數據連接,即數據傳輸通道
		if(!datachannel.Create()) {
			m_retmsg.LoadString(IDS_FTPMSG6);
			return FALSE;
		}
		datachannel.Connect(rhost,serversock); // 試圖異步連接服務器
	}
	if(!ReadStr()||m_fc!=1) return FALSE; // 獲得服務器響應
	if(!pasv&&!sockSrvr.Accept(datachannel)) return FALSE; // 接收從服務器來的內部綁定數據
	// 連接成功,然后進行阻塞式數據傳輸
	if((!datachannel.AsyncSelect(0))||(!datachannel.IOCtl(FIONBIO,&lpArgument))) {
		m_retmsg.LoadString(IDS_FTPMSG6);
		return FALSE;
	}
	while(1) { // 開始傳輸數據
		TRY {
			if(get) {
				if(!(num=datachannel.Receive(cbuf,BUFSIZE,0))||num==SOCKET_ERROR) break; // (EOF||network error)
				else datafile.Write(cbuf,num);
			}
			else {
				if(!(numread=datafile.Read(cbuf,BUFSIZE))) break; //EOF
				if((numsent=datachannel.Send(cbuf,numread,0))==SOCKET_ERROR) break;
				// 如果發送出去的字節少于從文件讀取的字節,則調整發送指針,以使得數據發送正確
				if(numread!=numsent) datafile.Seek(numsent-numread,CFile::current);
			}
		}
		CATCH (CException,e) {
			m_retmsg.LoadString(IDS_FTPMSG5);
			return FALSE;
		}
		END_CATCH
	}
	datachannel.Close();
	datafile.Close();
	if(!FTPcommand("")) return FALSE; // 檢查從服務器發送的傳輸結果信息
	return TRUE; // 傳輸成功
}


// 通過控制通道向服務器發送命令
BOOL CFTPCommandProcessor::WriteStr(CString outputstring) 
{
	m_retmsg.LoadString(IDS_FTPMSG6); // pre-load "network error" msg (in case there is one) #-)
	TRY {
		m_pCtrlTxarch->WriteString(outputstring+"\r\n");
		m_pCtrlTxarch->Flush();
	}
	CATCH(CException,e) {
		return FALSE;
	}
	END_CATCH
	return TRUE;
}


// 獲得服務器的響應
BOOL CFTPCommandProcessor::ReadStr() 
{
	int retcode;

	if(!ReadStr2()) return FALSE;

	if(m_retmsg.GetLength()<4||m_retmsg.GetAt(3)!='-') return TRUE;
	retcode=atol(m_retmsg);
	while(1) 
	{ //處理多行服務器響應

		if(m_retmsg.GetLength()>3&&(m_retmsg.GetAt(3)==' '&&atol(m_retmsg)==retcode)) 
			return TRUE;
		if(!ReadStr2()) 
			return FALSE;
	}
}



//////////////////////////////////////////////////////////////////////
// Private functions
//////////////////////////////////////////////////////////////////////


// 從服務器控制通道獲取一行響應
BOOL CFTPCommandProcessor::ReadStr2() 
{
	TRY 
	{
		if(!m_pCtrlRxarch->ReadString(m_retmsg)) 
		{
			m_retmsg.LoadString(IDS_FTPMSG6);
			return FALSE;
		}
	}
	CATCH(CException,e) 
	{
		m_retmsg.LoadString(IDS_FTPMSG6);
		return FALSE;
	}
	END_CATCH
	if(m_retmsg.GetLength()>0) m_fc=m_retmsg.GetAt(0)-48; // get 1st digit of the return code (indicates primary result)
	return TRUE;
}


// 打開控制通道
BOOL CFTPCommandProcessor::OpenControlChannel(CString serverhost,int serverport) 
{
	m_retmsg.LoadString(IDS_FTPMSG2);
	if(!(m_Ctrlsok=new CSocket)) return FALSE;
	if(!(m_Ctrlsok->Create())) return FALSE;
	m_retmsg.LoadString(IDS_FTPMSG3);
	if(!(m_Ctrlsok->Connect(serverhost,serverport))) return FALSE;
	m_retmsg.LoadString(IDS_FTPMSG2);
	if(!(m_pCtrlsokfile=new CSocketFile(m_Ctrlsok))) return FALSE;
	if(!(m_pCtrlRxarch=new CArchive(m_pCtrlsokfile,CArchive::load))) return FALSE;
	if(!(m_pCtrlTxarch=new CArchive(m_pCtrlsokfile,CArchive::store))) return FALSE;
	return TRUE;
}


// 關閉控制通道
void CFTPCommandProcessor::CloseControlChannel() 
{
	if(m_pCtrlTxarch) delete m_pCtrlTxarch;
	m_pCtrlTxarch=NULL;
	if(m_pCtrlRxarch) delete m_pCtrlRxarch;
	m_pCtrlRxarch=NULL;
	if(m_pCtrlsokfile) delete m_pCtrlsokfile;
	m_pCtrlsokfile=NULL;
	if(m_Ctrlsok) delete m_Ctrlsok;
	m_Ctrlsok=NULL;
	return;
}


//列出文件列表
BOOL CFTPCommandProcessor::List()
{
	CString lhost,temp,rhost;
	UINT localsock,i;
	CFile datafile;
	CSocket sockSrvr;
	CAsyncSocket datachannel;
	int num, sum;
	const int BUFSIZE = 4096;
	DWORD lpArgument=0;
	
	m_buf.RemoveAll();
	m_buf.SetSize(BUFSIZE);
	if(!FTPcommand("TYPE I")) 
		return FALSE; // 請求二進制模式

	m_retmsg.LoadString(IDS_FTPMSG6);
	// 獲取本地IP地址
	if(!m_Ctrlsok->GetSockName(lhost,localsock)) 
		return FALSE;;
	while(1) {
		// 將點轉化成逗號
		if((i=lhost.Find("."))==-1) break;
		lhost.SetAt(i,',');
	}
	if((!sockSrvr.Create(0, SOCK_STREAM, NULL))
			|| (!sockSrvr.Listen()))
		return FALSE;
	if(!sockSrvr.GetSockName(temp,localsock))
		return FALSE;
	lhost.Format(lhost+",%d,%d", localsock / 256, localsock % 256);
	if(!FTPcommand("PORT "+lhost)) 
		return FALSE;

	if(!WriteStr("LIST") )
		return FALSE;
	if(!ReadStr())
		return FALSE; 
	if(!sockSrvr.Accept(datachannel)) 
		return FALSE; 
	if((!datachannel.AsyncSelect(0)) || 
		(!datachannel.IOCtl(FIONBIO,&lpArgument))) {
		m_retmsg.LoadString(IDS_FTPMSG6);
		return FALSE;
	}
	sum = 0;
	while(1) { // 獲得數據
		TRY {
			if(!(num = datachannel.Receive(m_buf.GetData() + sum, BUFSIZE, 0)) 
				|| num == SOCKET_ERROR)
				break;
			TRACE("Received :%d\n", num);
			Sleep(0);
			sum += num;
			m_buf.SetSize(sum + BUFSIZE);
		}
		CATCH (CException,e) {
			m_retmsg.LoadString(IDS_FTPMSG5);
			return FALSE;
		}
		END_CATCH
	}
	datachannel.Close();
}


void CFTPCommandProcessor::ProcessList()
{
}

BOOL CFTPCommandProcessor::GetLine(int& ndx)
{
	m_strLine.Empty();
	int nBytes = m_buf.GetSize();
	BOOL bLine = FALSE;
	while ( bLine == FALSE && ndx < nBytes )
	{
		char ch = (char)(m_buf.GetAt( ndx ));
		switch( ch )
		{
		case '\n': // 行尾
			bLine = TRUE;
			break;
		default:   // 其他情況
			m_strLine += ch;
			break;
		}
		++ndx;
	}
	m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);
	return bLine;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产成人午夜在线一区| 日本不卡视频在线| 亚洲成人动漫在线免费观看| 精品一区二区在线免费观看| 欧美日韩一级片网站| 中文在线一区二区| 久久国产精品99久久人人澡| 欧洲视频一区二区| 亚洲欧美自拍偷拍色图| 久久精品99国产国产精| 欧美老女人在线| 一区二区三区在线观看国产| 不卡一区二区中文字幕| 久久综合色8888| 欧美96一区二区免费视频| 91久久久免费一区二区| 国产精品日日摸夜夜摸av| 国产高清视频一区| 久久综合成人精品亚洲另类欧美| 日韩和欧美一区二区| 欧美特级限制片免费在线观看| 国产精品久久久久9999吃药| 成人免费视频播放| 久久久九九九九| 国产999精品久久| 国产欧美综合在线观看第十页| 蜜桃av一区二区| 欧美r级在线观看| 另类小说欧美激情| 亚洲精品一区二区三区香蕉| 男女男精品视频网| 欧美一区二区三区视频免费| 五月婷婷综合激情| 欧美电影免费观看高清完整版在线观看| 一区二区三区91| 欧美精品 日韩| 蜜桃视频一区二区| 久久久美女毛片| 成人av在线播放网址| 日韩一区欧美一区| 色哟哟日韩精品| 亚洲一区二区三区影院| 欧美日韩国产首页| 青娱乐精品视频在线| 日韩免费看网站| 成人午夜大片免费观看| 亚洲女爱视频在线| 欧美色精品在线视频| 日本系列欧美系列| 精品三级在线观看| 99久久国产综合精品女不卡| 亚洲免费电影在线| 91精品视频网| 岛国av在线一区| 亚洲免费观看视频| 91.麻豆视频| 国产在线精品不卡| 一区二区三区欧美日| 欧美一级高清片在线观看| 国产成人一区在线| 亚洲一区二区三区精品在线| 欧美一级午夜免费电影| 国产精品自拍av| 亚洲国产欧美在线| 久久久欧美精品sm网站| 91黄色在线观看| 国模一区二区三区白浆| 亚洲男女毛片无遮挡| 欧美成人激情免费网| 99精品视频在线免费观看| 无吗不卡中文字幕| 国产精品视频一二| 欧美一级一区二区| 色欧美片视频在线观看 | 老鸭窝一区二区久久精品| 中文字幕不卡在线| 欧美一区二区视频在线观看 | 欧美在线制服丝袜| 韩国毛片一区二区三区| 亚洲黄色小说网站| 久久九九久精品国产免费直播| 欧美色网一区二区| 国产成人一级电影| 日本成人在线一区| 亚洲人成影院在线观看| 久久精品夜色噜噜亚洲a∨| 欧美网站一区二区| av在线这里只有精品| 国产中文一区二区三区| 天堂资源在线中文精品| 亚洲天堂a在线| 26uuu国产一区二区三区| 在线不卡中文字幕播放| 色综合久久综合| 成人v精品蜜桃久久一区| 国内精品伊人久久久久av影院| 亚洲综合激情另类小说区| 中文字幕在线一区二区三区| 欧美不卡在线视频| 91精品国产综合久久蜜臀| 欧美自拍偷拍一区| 91色porny在线视频| 国产盗摄精品一区二区三区在线 | 精品裸体舞一区二区三区| 欧美在线观看禁18| 91蝌蚪porny| 成人av在线播放网站| 成人精品在线视频观看| 国产一区91精品张津瑜| 久久精品国产精品亚洲精品| 日韩av电影免费观看高清完整版在线观看| 有坂深雪av一区二区精品| 欧美高清一级片在线观看| 国产女人水真多18毛片18精品视频| 精品剧情在线观看| 久久久亚洲精品一区二区三区 | 欧美午夜不卡视频| 在线观看一区日韩| 欧美日韩免费高清一区色橹橹| 91激情五月电影| 欧美日韩一二三区| 欧美大片国产精品| 精品91自产拍在线观看一区| 亚洲精品一区二区三区精华液| 26uuu国产电影一区二区| 久久久亚洲国产美女国产盗摄| 国产三级欧美三级日产三级99 | 久久先锋资源网| 久久亚洲影视婷婷| 欧美高清在线视频| 综合久久综合久久| 一区二区国产视频| 日韩精品亚洲专区| 国产综合色在线视频区| 国产成人超碰人人澡人人澡| 不卡av免费在线观看| 欧美影院午夜播放| 日韩一区二区三区av| 久久久久国产一区二区三区四区 | 国产欧美一区二区三区网站 | 欧美性高清videossexo| 欧美另类一区二区三区| 欧美xxxxxxxx| 国产精品午夜在线观看| 一区二区激情视频| 久久精品国产99国产| 丰满放荡岳乱妇91ww| 欧美最猛性xxxxx直播| 欧美一区二区网站| 亚洲欧美一区二区在线观看| 日本aⅴ免费视频一区二区三区| 看片网站欧美日韩| 91看片淫黄大片一级| 日韩欧美一区二区不卡| 国产精品午夜在线| 秋霞影院一区二区| 99久久婷婷国产综合精品电影 | 国产精品卡一卡二卡三| 亚洲一区二区在线免费看| 国产伦精一区二区三区| 在线看不卡av| 欧美国产1区2区| 美女在线视频一区| www.亚洲免费av| 久久综合久久综合亚洲| 亚洲aⅴ怡春院| 99久久综合国产精品| 欧美大片在线观看一区二区| 一区二区三区欧美日| av在线免费不卡| 欧美精品一区二| 午夜精品免费在线观看| 91蝌蚪国产九色| 国产精品免费视频网站| 国内精品免费在线观看| 欧美一级生活片| 亚洲v中文字幕| 91视视频在线观看入口直接观看www | 亚洲精品乱码久久久久久黑人| 久久99久久久久| 欧美日本免费一区二区三区| 亚洲女女做受ⅹxx高潮| 波多野结衣一区二区三区| 久久久久久久久久美女| 青青草国产精品97视觉盛宴| 欧美午夜影院一区| 亚洲免费在线看| 色婷婷av一区二区三区软件 | 亚洲国产视频一区二区| 波多野结衣精品在线| 国产精品区一区二区三区| 国产精品中文字幕一区二区三区| 精品久久久久久久久久久院品网| 日韩精品一二三区| 欧美高清精品3d| 久久精品国产精品青草| 久久欧美一区二区| 国产一区二区在线视频| 久久九九影视网| 9i看片成人免费高清|