www.pudn.com > zx.zip > zclientDlg.cpp


// zclientDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "zclient.h" 
#include "zclientDlg.h" 
#include "StatusDlg.h" 
#include "screendlg.h" 
#include "senddlg.h" 
 
#include "io.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
CZclientDlg *pDlg; 
CStatusDlg *pStatusDlg; 
CScreenDlg *pScreenDlg; 
CSendDlg *pSendDlg; 
UINT SearchIP(LPVOID nParam); 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	afx_msg void OnButtonMail(); 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
	ON_BN_CLICKED(IDC_BUTTON_MAIL, OnButtonMail) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CZclientDlg dialog 
 
CZclientDlg::CZclientDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CZclientDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CZclientDlg) 
	m_IP = _T(""); 
	m_Port = 0; 
	m_SearchIP = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
 
	pDlg=this; 
	pStatusDlg=NULL; 
	pScreenDlg=NULL; 
 
} 
 
void CZclientDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CZclientDlg) 
	DDX_Control(pDX, IDC_LIST_ACTIVEIP, m_ListActiveIP); 
	DDX_Control(pDX, IDC_LIST_FILE, m_List); 
	DDX_Control(pDX, IDC_TREE_DIR, m_Tree); 
	DDX_Text(pDX, IDC_EDIT_IP, m_IP); 
	DDV_MaxChars(pDX, m_IP, 15); 
	DDX_Text(pDX, IDC_EDIT_PORT, m_Port); 
	DDV_MinMaxUInt(pDX, m_Port, 1, 65536); 
	DDX_Text(pDX, IDC_EDIT_IP_SEARCH, m_SearchIP); 
	DDV_MaxChars(pDX, m_SearchIP, 11); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CZclientDlg, CDialog) 
	//{{AFX_MSG_MAP(CZclientDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect) 
	ON_BN_CLICKED(IDC_BUTTON_GETTREE, OnButtonGettree) 
	ON_BN_CLICKED(IDC_BUTTON_GETSCREEN, OnButtonGetscreen) 
	ON_COMMAND(ID_MENU_FILEOPT_SAVE, OnMenuFileoptSave) 
	ON_NOTIFY(NM_RCLICK, IDC_LIST_FILE, OnRclickListFile) 
	ON_NOTIFY(NM_CLICK, IDC_TREE_DIR, OnClickTreeDir) 
	ON_COMMAND(ID_MENU_FILEOPT_RUN, OnMenuFileoptRun) 
	ON_BN_CLICKED(IDC_BUTTON_SEARCHIP, OnButtonSearchIP) 
	ON_NOTIFY(NM_CLICK, IDC_LIST_ACTIVEIP, OnClickListActiveip) 
	ON_BN_CLICKED(IDC_BUTTON_LOCK, OnButtonLock) 
	ON_BN_CLICKED(IDC_BUTTON_UNLOCK, OnButtonUnlock) 
	ON_BN_CLICKED(IDC_BUTTON_SENDMESSAGE, OnButtonSendmessage) 
	ON_COMMAND(ID_MENU_FILEOPT_DELFILE, OnMenuFileoptDelfile) 
	ON_BN_CLICKED(IDC_BUTTON_REXIT, OnButtonRexit) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CZclientDlg message handlers 
 
BOOL CZclientDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	m_IP="\0"; 
	m_Port=3080; 
	UpdateData(FALSE); 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CZclientDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CZclientDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CZclientDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
BOOL CZclientDlg::ConnectSocket() 
{ 
	if(sktClient!=INVALID_SOCKET) 
	{ 
		closesocket(sktClient); 
	} 
	 
	//create socket 
 
	int ret; 
 
	hostent *host=NULL; 
	 
	sktClient=socket(AF_INET,SOCK_STREAM,0); 
	if(sktClient==INVALID_SOCKET) 
	{ 
		AfxMessageBox("无法创建SOCKET"); 
		return FALSE; 
	} 
	//set Recv and Send time out 
 
	int TimeOut=6000; //设置发送超时6秒 
	if(::setsockopt(sktClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) 
	{ 
		AfxMessageBox("设置发送超时错误"); 
		return FALSE; 
	} 
	TimeOut=6000;//设置接收超时6秒 
	 
	if(::setsockopt(sktClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) 
	{ 
		AfxMessageBox("设置接收超时错误"); 
		return FALSE; 
	} 
	//设置非阻塞方式连接 
	unsigned long ul = 1; 
	ret = ioctlsocket(sktClient, FIONBIO, (unsigned long*)&ul); 
	if(ret==SOCKET_ERROR) 
	{ 
		AfxMessageBox("连接方式设置错误"); 
		return FALSE; 
	} 
	//得到输入的IP地址 
 
	if(m_IP.GetLength()==0) 
	{ 
		AfxMessageBox("清输入IP地址"); 
		return FALSE; 
	} 
	//连接 
	sockaddrin.sin_family = AF_INET; 
	sockaddrin.sin_port = htons(m_Port); 
	sockaddrin.sin_addr .s_addr = inet_addr(m_IP); 
 
	if(sockaddrin.sin_addr.s_addr == INADDR_NONE) 
	{ 
		AfxMessageBox("真的有这个IP地址吗?"); 
		return FALSE; 
	} 
	 
	connect(sktClient,(const struct sockaddr *)&sockaddrin,sizeof(sockaddrin)); 
	 
	//select 模型,即设置超时 
	struct timeval timeout ; 
	fd_set r; 
	 
	FD_ZERO(&r); 
	FD_SET(sktClient, &r); 
 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
	timeout.tv_sec = 15; //连接超时15秒 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
 
	timeout.tv_usec =0; 
	ret = select(0, 0, &r, 0, &timeout); 
	if ( ret <= 0 ) 
	{ 
		closesocket(sktClient); 
		return FALSE; 
	} 
	//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式 
	unsigned long ul1= 0 ; 
	ret = ioctlsocket(sktClient, FIONBIO, (unsigned long*)&ul1); 
	if(ret==SOCKET_ERROR) 
	{ 
		closesocket (sktClient); 
		AfxMessageBox("连接方式设置错误"); 
		return FALSE; 
	} 
 
	//确认是Zserver 
	char cFlag[8]="zserve\0"; 
	send(sktClient,cFlag,8,0);//发送client端标志 
	strcmp(cFlag,"\0"); 
	recv(sktClient,cFlag,8,0);//接收server端标志 
 
	if(strcmp(cFlag,"zserve\0")) 
	{ 
		AfxMessageBox("请确认对方机器上运行了本软件的server端"); 
		return FALSE; 
	} 
	return TRUE; 
} 
 
void CZclientDlg::OnButtonConnect() //测试连接 
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(TRUE); 
	BeginWaitCursor(); 
	ShowStatusDlg(); 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	chrMission[0]=127;//设置命令 
	pStatusDlg->m_strStatusMsg ="正在尝试连接……"; 
	pStatusDlg->UpdateData(FALSE); 
 
	TestConnect(); 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
	EndWaitCursor(); 
} 
///////////////////////////////////////////////////////////////////// 
 
void CZclientDlg::OnButtonGettree()  
{ 
	// TODO: Add your control notification handler code here 
	//得到驱动器信息 
	 
	UpdateData(TRUE); 
	strListIP=m_IP; 
 
	BeginWaitCursor(); 
	ShowStatusDlg(); 
 
	strcpy(chrMission,"  \0"); 
	chrMission[0]=1;//设置命令 
	GetDriverInfo(); 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
} 
 
 
void CZclientDlg::GetItPath(HTREEITEM hitem,char *path)//得到全路径 ,hitem 是树的句柄,char 是得到的路径 
{ 
	char tpath[MAX_PATH]="\0"; 
	char chrtmp[MAX_PATH]="\0"; 
	do{ 
		strcpy(chrtmp,m_Tree.GetItemText(hitem)); 
		strcat(chrtmp,"\\"); 
		strcat(chrtmp,tpath); 
		strcpy(tpath,chrtmp); 
		hitem=m_Tree.GetParentItem(hitem); 
	}while(hitem!=0); 
	strcpy(path,tpath); 
} 
 
 
void CZclientDlg::TestConnect() 
{ 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
		return; 
	} 
	strcpy(chrReceive,"无法连接"); 
 
	send(sktClient,chrMission,300,0); 
	recv(sktClient,chrReceive,300,0); 
	closesocket(sktClient); 
	AfxMessageBox(chrReceive); 
	strcpy(chrReceive,"\0"); 
} 
 
void CZclientDlg::GetDriverInfo() 
{ 
	pStatusDlg->m_strStatusMsg ="正在连接"; 
	pStatusDlg->UpdateData (FALSE); 
 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
		return; 
	} 
	 
	m_Tree.DeleteAllItems(); 
	m_List.DeleteAllItems(); 
 
	send(sktClient,chrMission,300,0); 
 
	pStatusDlg->m_strStatusMsg ="下载信息"; 
	pStatusDlg->UpdateData (FALSE); 
 
	recv(sktClient,chrReceive,300,0); 
	 
	for(int i=0;i<=26;i++) 
	{ 
		if(isalpha(chrReceive[i])) 
		{ 
			if(chrReceive[i]=='?') 
				continue; 
 
			CString str; 
			str.Format ("%c:",chrReceive[i]); 
 
			m_Tree.InsertItem(str,TVI_ROOT,TVI_LAST ); 
		} 
	} 
	pStatusDlg->m_strStatusMsg ="完成"; 
	pStatusDlg->UpdateData (FALSE); 
 
	closesocket(sktClient); 
	 
} 
 
void CZclientDlg::listDirectory(HTREEITEM hTreeInst) 
{ 
 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
		return; 
	} 
 
	send(sktClient,chrMission,300,0); 
	DeleteTreeChildItem(hTreeInst); 
	m_List.DeleteAllItems(); 
	pStatusDlg->m_strStatusMsg ="接收数据"; 
	pStatusDlg->UpdateData (FALSE); 
 
	struct _MyFileInfo fileinfo; 
	do{ 
		recv(sktClient,(char*)&fileinfo,sizeof(_MyFileInfo),0); 
		if(fileinfo.Next ==0) 
			break; 
		HTREEITEM hit; 
		if(fileinfo.IsDirectory ==1) 
		{ 
			if(fileinfo.szFileName [0]=='.') 
				continue; 
			hit=m_Tree.InsertItem(fileinfo.szFileName ,hTreeInst,TVI_LAST); 
			m_Tree.InsertItem(NULL,hit,TVI_LAST); 
			 
		} 
		else 
		{ 
			m_List.InsertItem(0,fileinfo.szFileName ); 
		} 
	}while(fileinfo.InvaliDir !=1); 
	closesocket(sktClient); 
} 
 
void CZclientDlg::DeleteTreeChildItem(HTREEITEM hit) 
{ 
	HTREEITEM hchild; 
	hchild=m_Tree.GetChildItem(hit); 
	while(hchild!=0) 
	{ 
		m_Tree.DeleteItem(hchild); 
		hchild=m_Tree.GetChildItem(hit); 
	} 
 
} 
 
void CZclientDlg::ShowStatusDlg() 
{ 
	pStatusDlg = new CStatusDlg(this); 
	pStatusDlg->Create(IDD_DIALOG_STATUS,this); 
	pStatusDlg->ShowWindow(SW_SHOW); 
	pStatusDlg->SetActiveWindow (); 
	pStatusDlg->pDlg =this; 
 
} 
 
 
void CZclientDlg::OnButtonGetscreen()  
{ 
	// TODO: Add your control notification handler code here 
	//显示CScreenDlg 
 
	UpdateData(TRUE); 
 
	CScreenDlg dlg; 
	pScreenDlg = &dlg; 
	pScreenDlg->pDlg = this; 
	int nResponse = dlg.DoModal(); 
	if(nResponse!=IDCANCEL) 
	{ 
		AfxMessageBox("无法连接"); 
	} 
} 
 
 
 
void CZclientDlg::MouseEvent(_MyMouseEvent met) 
{ 
	pScreenDlg->SetWindowText ("屏幕控制 -> 发送鼠标动作"); 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
		return; 
	} 
	 
	send(sktClient,chrMission,300,0); 
	send(sktClient,(char*)&met,sizeof(_MyMouseEvent),0); 
	closesocket(sktClient); 
	pScreenDlg->SetWindowText ("屏幕控制 -> 空闲"); 
 
} 
 
void CZclientDlg::OnMenuFileoptSave()  
{ 
	// TODO: Add your command handler code here 
	ShowStatusDlg(); 
	HTREEITEM hitTree=m_Tree.GetSelectedItem(); 
	char FullPath[MAX_PATH]; 
	GetItPath(hitTree,FullPath); 
	 
	int ListSel=m_List.GetSelectionMark(); 
 
	strcat(FullPath,m_List.GetItemText(ListSel,0)); 
 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	strcat(chrMission,FullPath);//设置好要打开的文件 
 
	chrMission[0]=6;//设置命令 
 
	DownLoadFile(); 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
} 
 
void CZclientDlg::OnRclickListFile(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
 
	POINT ptMouse; 
	POINT ptClientMouse; 
 
	GetCursorPos(&ptMouse); 
 
	ptClientMouse=ptMouse; 
	m_List.ScreenToClient(&ptClientMouse); 
	int ListSel=m_List.HitTest(ptClientMouse,0); 
	if(ListSel==-1) 
		return; 
 
	UpdateData(TRUE); 
 
	if(strListIP!=m_IP) 
	{ 
		AfxMessageBox("你改变了对方的IP地址\n需要重新得到驱动器信息"); 
		OnButtonGettree(); 
		return; 
	} 
 
	CMenu menu; 
	VERIFY(menu.LoadMenu(IDR_MENU_FILEOPT)); 
	CMenu* pPopup = menu.GetSubMenu(0); 
	ASSERT(pPopup != NULL); 
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, ptMouse.x, ptMouse.y, this); 
	*pResult = 0; 
} 
 
void CZclientDlg::OnClickTreeDir(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	BeginWaitCursor(); 
	POINT ptMouse; 
	GetCursorPos(&ptMouse); 
	m_Tree.ScreenToClient(&ptMouse); 
	HTREEITEM TreeSel=m_Tree.HitTest(ptMouse,0); 
	if(!TreeSel) 
		return; 
 
	UpdateData(TRUE); 
 
	if(strListIP!=m_IP) 
	{ 
		AfxMessageBox("你改变了对方的IP地址\n需要重新得到驱动器信息"); 
		OnButtonGettree(); 
		return; 
	} 
	ShowStatusDlg(); 
 
	HTREEITEM hTreeInst; 
	char chrPath[MAX_PATH]; 
 
	GetItPath(TreeSel,chrPath);//得到当前展开的路径 
	hTreeInst=TreeSel; 
	 
	strcpy(chrMission,"  \0");//为命令留出空间 
	strcat(chrMission,chrPath);//设置好要列出的目录 
	chrMission[0]=2;//设置命令 
	 
	listDirectory(hTreeInst); 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
	*pResult = 0; 
} 
 
void CZclientDlg::OnMenuFileoptRun()  
{ 
	// TODO: Add your command handler code here 
	ShowStatusDlg(); 
	BeginWaitCursor(); 
	HTREEITEM hitTree=m_Tree.GetSelectedItem(); 
	char FullPath[MAX_PATH]; 
	GetItPath(hitTree,FullPath); 
	 
	int ListSel=m_List.GetSelectionMark(); 
 
	strcat(FullPath,m_List.GetItemText(ListSel,0)); 
 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	strcat(chrMission,FullPath);//设置好要打开的文件 
 
	chrMission[0]=5;//设置命令 
 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
		return; 
	} 
	 
	send(sktClient,chrMission,300,0); 
	closesocket(sktClient); 
	 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
 
 
} 
 
void CZclientDlg::DownLoadFile() 
{ 
	//显示对话框 
	CFileDialog	Dlg(FALSE); 
	if(Dlg.DoModal()!=IDOK) 
	{ 
		return; 
	} 
 
	//新建文件 
 
 
	CFile FileWrite; 
	if(!FileWrite.Open (Dlg.GetPathName (),CFile::modeCreate| 
		CFile::modeWrite| 
		CFile::typeBinary)) 
	{ 
		AfxMessageBox("创建文件失败!",MB_OK|MB_ICONERROR); 
		return; 
	} 
 
	FileWrite.SeekToBegin (); 
	 
	//连接 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
		return; 
	} 
	 
	send(sktClient,chrMission,300,0); 
 
	recv(sktClient,chrReceive,300,0); 
	if(!strcmp(chrReceive,"FailOpenFile\0")) 
	{ 
		AfxMessageBox("对方无法打开文件,可能文件正在使用",MB_OK|MB_ICONERROR); 
		closesocket(sktClient); 
		FileWrite.Close ();; 
		return; 
	} 
 
	_finddata_t pFileInfo; 
	recv(sktClient,(char *)&pFileInfo,sizeof(_finddata_t)+1,0); 
 
	BYTE *pBuffer=new BYTE[SENDBLOCK]; 
	 
	memset(pBuffer,0,SENDBLOCK); 
 
	int StopFlag=0xFFFF; 
	send(sktClient,(char*)&StopFlag,sizeof(int)+1,0); 
 
	for(WORD i=0;i<(pFileInfo.size /SENDBLOCK);i++) 
	{ 
		recv(sktClient,(char*)pBuffer,SENDBLOCK,0); 
		FileWrite.Write (pBuffer,SENDBLOCK); 
		memset(pBuffer,0,SENDBLOCK); 
 
		send(sktClient,(char*)&StopFlag,sizeof(int)+1,0); 
 
	} 
	 
	DWORD w=pFileInfo.size %SENDBLOCK; 
	if(w) 
	{ 
		recv(sktClient,(char*)pBuffer,w,0); 
 
		FileWrite.Write (pBuffer,w); 
	} 
 
	FileWrite.Close (); 
	closesocket(sktClient); 
	 
} 
 
void CZclientDlg::OnButtonSearchIP()  
{ 
	// TODO: Add your control notification handler code here 
	ShowStatusDlg(); 
 
	BeginWaitCursor(); 
 
	UpdateData(TRUE); 
	if(m_SearchIP.GetLength()==0) 
	{ 
		AfxMessageBox("清输入要搜索的IP段"); 
 
		pStatusDlg->pDlg = NULL; 
		pStatusDlg->EndDialog (0); 
		pStatusDlg=0; 
 
		return; 
	} 
	 
	pStatusDlg->m_strStatusMsg.Format("准备开始搜索IP段%s",m_SearchIP); 
	pStatusDlg->UpdateData (FALSE); 
 
	m_ListActiveIP.DeleteAllItems(); 
 
	int uIP[256]; 
	 
	for(int i=0;i<=255;i++) 
	{ 
		uIP[i]=i; 
		pStatusDlg->m_strStatusMsg .Format("正在搜索%s.%d",m_SearchIP,i); 
		pStatusDlg->UpdateData (FALSE); 
 
		AfxBeginThread(SearchIP,&uIP[i]); 
		Sleep(20); 
	} 
	for(i=20;i>=1;i--) 
	{ 
		Sleep(1000); 
		pStatusDlg->m_strStatusMsg .Format("正在等待数据返回,剩余%d秒",i); 
		pStatusDlg->UpdateData(FALSE); 
	} 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
 
} 
 
UINT SearchIP(LPVOID nParam) 
{ 
	SOCKET skt; 
	//create socket 
 
	int ret; 
 
	hostent *host=NULL; 
	 
	skt=socket(AF_INET,SOCK_STREAM,0); 
	if(skt==INVALID_SOCKET) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
	//set Recv and Send time out 
 
	int TimeOut=6000; //设置发送超时6秒 
	if(::setsockopt(skt,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
	TimeOut=6000;//设置接收超时6秒 
	 
	if(::setsockopt(skt,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
	//设置非阻塞方式连接 
	unsigned long ul = 1; 
	ret = ioctlsocket(skt, FIONBIO, (unsigned long*)&ul); 
	if(ret==SOCKET_ERROR) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
	 
	//连接 
	CString strSearchIP,strTmp; 
	strTmp.Format ("%d",*(int *)nParam); 
	strSearchIP.Format("%s.%s",pDlg->m_SearchIP,strTmp); 
 
	struct sockaddr_in sockaddrin; 
	sockaddrin.sin_family = AF_INET; 
	sockaddrin.sin_port = htons(3080); 
	sockaddrin.sin_addr .s_addr = inet_addr(strSearchIP); 
 
	if(sockaddrin.sin_addr.s_addr == INADDR_NONE) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
	 
	connect(skt,(const struct sockaddr *)&sockaddrin,sizeof(sockaddrin)); 
	 
	//select 模型,即设置超时 
	struct timeval timeout ; 
	fd_set r; 
	 
	FD_ZERO(&r); 
	FD_SET(skt, &r); 
 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
	timeout.tv_sec = 15;//连接超时15秒 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
	//////////////////////////////////////////////////////////////////////////////////// 
 
	timeout.tv_usec =0; 
	ret = select(0, 0, &r, 0, &timeout); 
	if ( ret <= 0 ) 
	{ 
		closesocket(skt); 
		return FALSE; 
	} 
	//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式 
	unsigned long ul1= 0 ; 
	ret = ioctlsocket(skt, FIONBIO, (unsigned long*)&ul1); 
	if(ret==SOCKET_ERROR) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
 
	//确认是Zserver 
	char cFlag[8]="zserve\0"; 
	send(skt,cFlag,8,0);//发送client端标志 
	 
	recv(skt,cFlag,8,0);//接收server端标志 
 
	if(strcmp(cFlag,"zserve\0")) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
 
	char chrM[300],chrR[300]; 
 
	strcpy(chrM,"  \0");//为命令留出一位(见readme文件) 
	chrM[0]=127;//设置命令 
 
	send(skt,chrM,300,0); 
 
	recv(skt,chrR,300,0); 
		 
	if(strcmp(chrR,"连接成功")) 
	{ 
		closesocket (skt); 
		return FALSE; 
	} 
 
	pDlg->m_ListActiveIP .InsertItem(0,strSearchIP ); 
 
	closesocket(skt); 
 
	return TRUE; 
 
} 
 
void CZclientDlg::OnClickListActiveip(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	 
	POINT ptMouse; 
	POINT ptClientMouse; 
 
	GetCursorPos(&ptMouse); 
 
	ptClientMouse=ptMouse; 
	m_ListActiveIP.ScreenToClient(&ptClientMouse); 
	int ListSel=m_ListActiveIP.HitTest(ptClientMouse,0); 
	if(ListSel==-1) 
		return; 
 
	m_IP=m_ListActiveIP.GetItemText(ListSel,0); 
	m_Port=3080; 
	UpdateData(FALSE); 
	 
	m_List.DeleteAllItems(); 
	m_Tree.DeleteAllItems(); 
 
	*pResult = 0; 
} 
 
void CZclientDlg::OnButtonLock()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(TRUE); 
	BeginWaitCursor(); 
	ShowStatusDlg(); 
	pStatusDlg->m_strStatusMsg ="正在连接"; 
	pStatusDlg->UpdateData(FALSE); 
 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	chrMission[0]=7;//设置命令 
 
	if(!ConnectSocket()) 
	{ 
		EndWaitCursor(); 
		AfxMessageBox("无法连接"); 
		pStatusDlg->pDlg = NULL; 
		pStatusDlg->EndDialog (0); 
		pStatusDlg=0; 
 
		return; 
	} 
	pStatusDlg->m_strStatusMsg ="发送命令"; 
	pStatusDlg->UpdateData(FALSE); 
	 
	send(sktClient,chrMission,300,0); 
 
	closesocket(sktClient); 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
	EndWaitCursor(); 
} 
 
void CZclientDlg::OnButtonUnlock()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(TRUE); 
	BeginWaitCursor(); 
	ShowStatusDlg(); 
 
	pStatusDlg->m_strStatusMsg ="正在连接"; 
	pStatusDlg->UpdateData(FALSE); 
 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	chrMission[0]=8;//设置命令 
 
	if(!ConnectSocket()) 
	{ 
		EndWaitCursor(); 
		AfxMessageBox("无法连接"); 
		pStatusDlg->pDlg = NULL; 
		pStatusDlg->EndDialog (0); 
		pStatusDlg=0; 
 
		return; 
	} 
	EndWaitCursor(); 
 
	pStatusDlg->m_strStatusMsg ="发送命令"; 
	pStatusDlg->UpdateData(FALSE); 
 
	send(sktClient,chrMission,300,0); 
	EndWaitCursor(); 
 
	closesocket(sktClient); 
 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
} 
 
void CZclientDlg::OnButtonSendmessage()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData(TRUE); 
 
	if(m_IP.GetLength()==0) 
	{ 
		AfxMessageBox("清输入IP地址"); 
		return; 
	} 
 
	CSendDlg dlg; 
	pSendDlg = &dlg; 
	pSendDlg->pDlg = this; 
	int nResponse = dlg.DoModal(); 
 
} 
 
void CZclientDlg::OnMenuFileoptDelfile()  
{ 
	// TODO: Add your command handler code here 
	ShowStatusDlg(); 
	BeginWaitCursor(); 
	HTREEITEM hitTree=m_Tree.GetSelectedItem(); 
	char FullPath[MAX_PATH]; 
	GetItPath(hitTree,FullPath); 
	 
	int ListSel=m_List.GetSelectionMark(); 
 
	strcat(FullPath,m_List.GetItemText(ListSel,0)); 
 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	strcat(chrMission,FullPath);//设置好要打开的文件 
 
	chrMission[0]=10;//设置命令 
	pStatusDlg->m_strStatusMsg ="正在连接"; 
	pStatusDlg->UpdateData (FALSE); 
 
	if(!ConnectSocket()) 
	{ 
		AfxMessageBox("无法连接"); 
	 
		pStatusDlg->pDlg = NULL; 
		pStatusDlg->EndDialog (0); 
		pStatusDlg=0; 
 
		return; 
	} 
	pStatusDlg->m_strStatusMsg ="发送命令"; 
	pStatusDlg->UpdateData (FALSE); 
 
	send(sktClient,chrMission,300,0); 
	pStatusDlg->pDlg = NULL; 
	pStatusDlg->EndDialog (0); 
	pStatusDlg=0; 
 
} 
 
void CAboutDlg::OnButtonMail()  
{ 
	// TODO: Add your control notification handler code here 
	ShellExecute(0,0,"mailto:zant_etsu@hotmail.com",0,0,SW_SHOWNORMAL); 
 
} 
 
void CZclientDlg::OnButtonRexit()  
{ 
	// TODO: Add your control notification handler code here 
	BeginWaitCursor(); 
	UpdateData(TRUE); 
	strcpy(chrMission,"  \0");//为命令留出一位(见readme文件) 
	chrMission[0]=11;//设置命令 
 
 
	if(!ConnectSocket()) 
	{ 
 
		AfxMessageBox("无法连接"); 
		EndWaitCursor(); 
		return; 
	} 
 
	send(sktClient,chrMission,300,0); 
	closesocket(sktClient); 
 
	EndWaitCursor(); 
	 
}