⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 samplemfcsockclientdlg.cpp

📁 这是另外一个基于CAsyncSocket类,客户端程序!
💻 CPP
字号:

#include "stdafx.h"
#include "SampleMfcSockClient.h"
#include "SampleMfcSockClientDlg.h"
#include "MyClientSocketThread.h"
#include "MyClientSocket.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

const int ID_TIMER_CHECK_RECV = 1234;

// 捠怣僗儗僢僪廔椆捠抦儊僢僙乕僕
UINT CSampleMfcSockClientDlg::c_uiMsgEndThread = ::RegisterWindowMessage("SampleMfcSockClientEndThread");

CSampleMfcSockClientDlg::CSampleMfcSockClientDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSampleMfcSockClientDlg::IDD, pParent)
	, m_strUrl(CString())
	, m_uiPort(80)
	, m_pMyObj(NULL)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CSampleMfcSockClientDlg::~CSampleMfcSockClientDlg()
{
}

void CSampleMfcSockClientDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSampleMfcSockClientDlg, CDialog)
	ON_BN_CLICKED(IDC_MAIN_GET, OnBnClickedMainGet)
	ON_BN_CLICKED(IDC_MAIN_CANCEL, OnBnClickedMainCancel)
	ON_WM_TIMER()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
	ON_REGISTERED_MESSAGE(c_uiMsgEndThread, OnMsgEndThread)
END_MESSAGE_MAP()


//
//	WM_INITDIALOG
//
BOOL CSampleMfcSockClientDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// 戝偒偄傾僀僐儞偺愝掕
	SetIcon(m_hIcon, FALSE);		// 彫偝偄傾僀僐儞偺愝掕

	setControlsState();

	// 庴怣僨乕僞搑拞宱夁昞帵梡僞僀儅乕
	SetTimer(ID_TIMER_CHECK_RECV, 500, NULL);

	return TRUE;  // 僼僅乕僇僗傪僐儞僩儘乕儖偵愝掕偟偨応崌傪彍偒丄TRUE 傪曉偟傑偡丅
}

//
//	[Get] 儃僞儞墴壓
//
void CSampleMfcSockClientDlg::OnBnClickedMainGet()
{
	GetDlgItemText(IDC_MAIN_URL, m_strUrl);

	if (m_pMyObj) {
		AfxMessageBox("Already running");
	} else {
		m_pMyObj = new CMyClientSocketThread(GetSafeHwnd(), c_uiMsgEndThread, m_strUrl, 80);

		setControlsState();
	}
}

//
//	捠怣僗儗僢僪廔椆捠抦儊僢僙乕僕
//
LRESULT CSampleMfcSockClientDlg::OnMsgEndThread(WPARAM wParam, LPARAM lParam)
{
	// 捠忢偼偙偺儊僢僙乕僕偑棃偨帪揰偱僗儗僢僪偼廔椆偟偰偄傞偙偲偑懡偄傛偆偩偑丄
	// 杮娭悢偺幚峴偺曽偑僗儗僢僪廔椆傛傝愭偵側偭偰偟傑偆応崌傕偁傞丅
	// 側偺偱丄妋幚偵僗儗僢僪廔椆傪懸偮丅
	m_pMyObj->WaitForEndThread();

	if (m_pMyObj->IsCanceled()) {
		;
	} else if (m_pMyObj->GetErrInfo()->IsError()) {
		CString strMsg = buildErrorMsg();
		AfxMessageBox(strMsg);
	} else {
		CFileDialog dlg(FALSE, NULL, NULL, OFN_ENABLESIZING | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT);
		if (IDOK == dlg.DoModal()) {
			saveToFile(dlg.GetPathName());
		}
	}

	delete m_pMyObj;
	m_pMyObj = NULL;

	setControlsState();

	return 0;
}

//
//	[僉儍儞僙儖]儃僞儞墴壓
//
void CSampleMfcSockClientDlg::OnBnClickedMainCancel()
{
	if (m_pMyObj) {
		m_pMyObj->SetCancel();
//		m_pMyObj->WaitForEndThread();
	}
}

//
//	僟僀傾儘僌偑暵偠傜傟傞帪
//
void CSampleMfcSockClientDlg::OnClose()
{
	OnBnClickedMainCancel();

	CDialog::OnClose();
}

//
//	尰嵼偺捠怣忬懺偵傛偭偰儃僞儞僐儞僩儘乕儖椶傪桳岠乛柍岠壔偡傞
//
void CSampleMfcSockClientDlg::setControlsState()
{
	const BOOL bRunning = m_pMyObj ? TRUE : FALSE;
		
	GetDlgItem(IDC_MAIN_GET)->EnableWindow(!bRunning);
	GetDlgItem(IDCANCEL)->EnableWindow(!bRunning);
	GetDlgItem(IDC_MAIN_CANCEL)->EnableWindow(bRunning);
}

//
//	庴怣寢壥傪僼傽僀儖偵曐懚偡傞
//
bool CSampleMfcSockClientDlg::saveToFile(const CString& strFileName)
{
	CFile file;
	if (!file.Open(strFileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite)) {
		return false;
	}

	CByteArray bufData;
	m_pMyObj->GetRecvData(bufData);
	file.Write(bufData.GetData(), bufData.GetSize());

	return true;
}

//
//	WM_TIMER乮庴怣僶僀僩悢搑拞宱夁昞帵梡乯
//
void CSampleMfcSockClientDlg::OnTimer(UINT nIDEvent)
{
	if (m_pMyObj) {
		const int nRecvBytes = m_pMyObj->GetReceivedBytes();
		char szBuf[256];
		wsprintf(szBuf, "%d bytes received", nRecvBytes);
		SetDlgItemText(IDC_MAIN_RECEIVED_BYTE, szBuf);
	}

	CDialog::OnTimer(nIDEvent);
}

CString CSampleMfcSockClientDlg::buildErrorMsg() const
{
	const CErrInfo* pErrInfo = m_pMyObj->GetErrInfo();

	CString strFormat;

	switch (pErrInfo->ErrCode()) {
	case CErrInfo::errNoError:
	case CErrInfo::errCanceled:
		break;
	case CErrInfo::errInvalidUrl:
		strFormat = "柍岠側URL偑巜掕偝傟傑偟偨";
		break;
	case CErrInfo::errCreateSocket:
		strFormat = "socket偺惗惉偵幐攕偟傑偟偨";
		break;
	case CErrInfo::errTimeOut:
		strFormat = "僞僀儉傾僂僩僄儔乕";
		break;
	case CErrInfo::errConnect:
		strFormat = "愙懕僄儔乕\n\n僄儔乕僐乕僪丗%d\n僄儔乕徻嵶丗%s";
		break;
	case CErrInfo::errSend:
		strFormat= "憲怣僄儔乕\n\n僄儔乕僐乕僪丗%d\n僄儔乕徻嵶丗%s";
		break;
	case CErrInfo::errReceive:
		strFormat = "庴怣僄儔乕\n\n僄儔乕僐乕僪丗%d\n僄儔乕徻嵶丗%s";
		break;
	case CErrInfo::errSystem:
		strFormat = "僔僗僥儉僄儔乕\n\n僄儔乕僐乕僪丗%d\n僄儔乕徻嵶丗%s";
		break;
	default:
		break;
	}

	if (strFormat.IsEmpty()) {
		return "";
	}

	CString strErrMsg;
	strErrMsg.Format(strFormat, pErrInfo->SysErrCode(), (LPCTSTR)pErrInfo->BuildSysErrMsg());

	return strErrMsg;
}

void CSampleMfcSockClientDlg::OnOK()
{
	// Enter僉乕偱暵偠側偄傛偆偵
//	CDialog::OnOK();	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -