www.pudn.com > 数据传输局域网.rar > ClientDlg.cpp


// ClientDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "FileShare.h" 
#include "ClientDlg.h" 
 
#include "ThreadProc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
extern CStatusBarCtrl g_StatusBar; 
///////////////////////////////////////////////////////////////////////////// 
// CClientDlg dialog 
 
 
CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CClientDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CClientDlg) 
	m_strFileName = _T(""); 
	m_nPort = 488; 
	m_strAddr = _T(""); 
	m_strMessage = _T(""); 
	m_nTime = 0; 
	//}}AFX_DATA_INIT 
	this->m_nLastSend=0; 
	this->m_nTotalSend=0; 
} 
 
 
void CClientDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CClientDlg) 
	DDX_Text(pDX, IDC_FILENAME, m_strFileName); 
	DDX_Text(pDX, IDC_PORT, m_nPort); 
	DDX_Text(pDX, IDC_SERVERADDRESS, m_strAddr); 
	DDX_Text(pDX, IDC_MESSAGE, m_strMessage); 
	DDX_Text(pDX, IDC_EDIT_TIMEV, m_nTime); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CClientDlg, CDialog) 
	//{{AFX_MSG_MAP(CClientDlg) 
	ON_WM_LBUTTONDBLCLK() 
	ON_WM_SIZE() 
	ON_BN_CLICKED(IDC_SEND, OnSend) 
	ON_MESSAGE(WM_THREADMSG,OnThreadMsg) 
	ON_WM_TIMER() 
	ON_WM_DESTROY() 
	ON_BN_CLICKED(IDC_BROWSE_FILE, OnBrowseFile) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CClientDlg message handlers 
 
void CClientDlg::OnLButtonDblClk(UINT nFlags, CPoint point)  
{ 
AfxMessageBox("dsfsdf");	 
//	CDialog::OnLButtonDblClk(nFlags, point); 
} 
 
void CClientDlg::OnSize(UINT nType, int cx, int cy)  
{ 
	CDialog::OnSize(nType, cx, cy); 
	HWND h; 
	h=::GetDlgItem(this->GetSafeHwnd(),IDC_MESSAGE); 
	::SetWindowPos(h,NULL,0,140,cx,cy-140,0); 
} 
 
void CClientDlg::OnSend()  
{ 
	UpdateData(true); 
	char				addr[512]; 
	CString				strFileName,strTmp; 
	struct sockaddr_in	sock_addr; 
	DWORD				ip; 
 	SERVICEPARM			*p; 
	int					nIndex; 
	 
	strcpy(addr,(char*)(LPCTSTR)this->m_strAddr); 
	if(GetAddr(addr,&ip)) 
	{ 
		AfxMessageBox("无法解析主机地址!"); 
		return; 
	} 
	sock_addr.sin_family=AF_INET; 
	sock_addr.sin_port=htons(this->m_nPort); 
	sock_addr.sin_addr.S_un.S_addr = htonl(ip); 
 
	strTmp = this->m_strFileName; 
	nIndex=strTmp.Find("\r\n",0); 
	if(nIndex==-1) 
	{ 
		strFileName=strTmp; 
	} 
	else 
	{ 
		strFileName=strTmp.Left(nIndex); 
		strTmp = strTmp.Right(strTmp.GetLength()-nIndex-2); 
	} 
 
	while(strFileName.GetLength()) 
	{ 
		p=(SERVICEPARM*)malloc(sizeof(SERVICEPARM)); 
		p->sockservice = socket(AF_INET,SOCK_STREAM,0); 
		if(connect(p->sockservice,(sockaddr*)&sock_addr,sizeof(sock_addr))) 
		{ 
			free(p); 
			AfxMessageBox("无法连接到主机!"); 
			return; 
		} 
		strcpy(p->path,strFileName.GetBuffer(1)); 
		p->hwndServerDlg=this->GetSafeHwnd(); 
		p->nTime = m_nTime; 
		if(AfxBeginThread(SendDataProc,p)==NULL) 
		{ 
			AfxMessageBox("创建线程失败!"); 
			return; 
		} 
		else 
		{ 
			GetDlgItem(IDC_SEND)->EnableWindow(false); 
		} 
 
		nIndex=strTmp.Find("\r\n",0); 
		if(nIndex==-1) 
		{ 
			strFileName=""; 
		} 
		else 
		{ 
			strFileName=strTmp.Left(nIndex); 
			strTmp = strTmp.Right(strTmp.GetLength()-nIndex-2); 
		} 
	} 
} 
 
BOOL CClientDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
 
	char	sz[256]; 
 
	GetPrivateProfileString(FILESHARE,SERVERADDR,"",sz,sizeof(sz),CONFIG_FILE); 
	this->m_strAddr=sz; 
	GetPrivateProfileString(FILESHARE,SERVERPORT,"",sz,sizeof(sz),CONFIG_FILE); 
	this->m_nPort = atoi(sz); 
	GetPrivateProfileString(FILESHARE,FILENAME,"",sz,sizeof(sz),CONFIG_FILE); 
	this->m_strFileName=sz; 
	UpdateData(false); 
 
	this->SetTimer(SEND_SPEED_TIMER,TIMER_LONG,NULL); 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CClientDlg::OnThreadMsg(WPARAM wParm,LPARAM lParm) 
{ 
	UpdateData(true); 
	char msg[1024]; 
	switch(wParm) 
	{ 
	case MSG_THREADEXIT: 
		GetDlgItem(IDC_SEND)->EnableWindow(true); 
		break; 
	case MSG_SHOWMSG: 
		strcpy(msg,(char*)lParm); 
		this->m_strMessage+=msg; 
		UpdateData(false); 
		break; 
	case MSG_STATUSBAR_MSG: 
		strcpy(msg,(char*)lParm); 
		this->GetParent()->SetWindowText(msg); 
		break; 
	case MSG_SEND_DATA: 
		this->m_nLastSend += (DWORD)lParm; 
		break; 
	default: 
		break; 
	}	 
} 
 
void CClientDlg::OnTimer(UINT nIDEvent)  
{ 
	DWORD	nSpeed; 
	char	msg[512]; 
	static char	s1[3]; 
	static char	s2[3]; 
	float	n1,n2; 
	switch(nIDEvent) 
	{ 
	case SEND_SPEED_TIMER: 
		 
		{ 
			nSpeed = this->m_nLastSend/(TIMER_LONG/1000); 
			this->m_nTotalSend += this->m_nLastSend; 
			if(m_nTotalSend/MB) 
			{ 
				s1[0]='M'; 
				s1[1]='B'; 
				n1=(float)m_nTotalSend/MB; 
			} 
			else if(m_nTotalSend/KB) 
			{ 
				s1[0]='K'; 
				s1[1]='B'; 
				n1=(float)m_nTotalSend/KB; 
			} 
			else 
			{ 
				s1[0]='B'; 
				s1[1]=0; 
				n1=(float)m_nTotalSend; 
			} 
			if(nSpeed/MB) 
			{ 
				s2[0]='M'; 
				s2[1]='B'; 
				n2=(float)nSpeed/MB; 
			} 
			else if(nSpeed/KB) 
			{ 
				s2[0]='K'; 
				s2[1]='B'; 
				n2=(float)nSpeed/KB; 
			} 
			else 
			{ 
				s2[0]='B'; 
				s2[1]=0; 
				n2=(float)nSpeed; 
			} 
			sprintf(msg,"发送:%0.3f%s 速度:%0.3f%sps",n1,s1,n2,s2); 
			this->m_nLastSend = 0; 
			g_StatusBar.SetText(msg,1,NULL); 
		} 
		break; 
	default: 
		CDialog::OnTimer(nIDEvent); 
		break; 
	} 
} 
 
CClientDlg::~CClientDlg() 
{ 
} 
 
void CClientDlg::OnDestroy()  
{ 
 
	UpdateData(TRUE); 
	char sz[32]; 
	WritePrivateProfileString(FILESHARE,SERVERADDR,(LPCTSTR)this->m_strAddr,CONFIG_FILE); 
	sprintf(sz,"%d",this->m_nPort); 
	WritePrivateProfileString(FILESHARE,SERVERPORT,sz,CONFIG_FILE); 
	WritePrivateProfileString(FILESHARE,FILENAME,(LPCTSTR)this->m_strFileName,CONFIG_FILE); 
 
	CDialog::OnDestroy();	 
	// TODO: Add your message handler code here	 
} 
 
void CClientDlg::OnBrowseFile()  
{ 
	UpdateData(true); 
 
	OPENFILENAME	OpenFileName; 
	char			szFileName[1024]={0}; 
	char			dir[256]; 
	char			file[256]; 
	int				nIndex; 
 
	memset(&OpenFileName,0,sizeof(OpenFileName)); 
	OpenFileName.lStructSize		= sizeof(OPENFILENAME); 
	OpenFileName.hwndOwner			= this->GetSafeHwnd(); 
	OpenFileName.hInstance			= AfxGetInstanceHandle(); 
	OpenFileName.lpstrFilter		= "所有文件(*.*)\0*.*\0\0"; 
 
	OpenFileName.lpstrFile         = szFileName; 
	OpenFileName.nMaxFile          = sizeof (szFileName); 
	OpenFileName.lpstrFileTitle    = ""; 
	OpenFileName.nMaxFileTitle     = 0; 
	OpenFileName.lpstrInitialDir   = NULL; 
	OpenFileName.lpstrTitle        = "选择发送文件"; 
	OpenFileName.Flags			   = OFN_NOCHANGEDIR| 
									 OFN_EXPLORER| 
									 OFN_ALLOWMULTISELECT; 
	//OpenFileName.Flags =0; 
	OpenFileName.nFileOffset       = 0; 
	OpenFileName.nFileExtension    = 1; 
	OpenFileName.lpstrDefExt		=NULL; 
 
	 
	if(::GetOpenFileName(&OpenFileName)) 
	{ 
		this->m_strFileName=""; 
		nIndex=0; 
		strcpy(dir,szFileName); 
		if(dir[strlen(dir)-1]!='\\') 
		{ 
			strcat(dir,"\\"); 
			nIndex=strlen(dir); 
		} 
		else 
		{ 
			nIndex=strlen(dir)+1; 
		} 
		if(strlen(&szFileName[nIndex])>0) 
		{ 
			while(strlen(&szFileName[nIndex])>0) 
			{ 
				sprintf(file,"%s%s\r\n",dir,&szFileName[nIndex]); 
				this->m_strFileName += file; 
				nIndex += strlen(&szFileName[nIndex])+1; 
			} 
		} 
		else 
		{ 
			m_strFileName=szFileName; 
		} 
		UpdateData(false); 
	} 
	 
}