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

📄 testclientdlg.cpp

📁 一个c++ 网络编程的示例
💻 CPP
字号:
// TestClientDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestClient.h"
#include "TestClientDlg.h"
#include <afxsock.h>
#include<connmgr.h>

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

/////////////////////////////////////////////////////////////////////////////
// CTestClientDlg dialog

CTestClientDlg::CTestClientDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestClientDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestClientDlg)
	m_remoteHost = _T("");
	m_remotePort = 0;
	m_sendData = _T("");
	m_recvData = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestClientDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestClientDlg)
	DDX_Text(pDX, IDC_EDTREMOTEHOST, m_remoteHost);
	DDX_Text(pDX, IDC_EDTREMOTEPORT, m_remotePort);
	DDX_Text(pDX, IDC_EDTSENDDATA, m_sendData);
	DDX_Text(pDX, IDC_EDTRECV, m_recvData);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestClientDlg, CDialog)
	//{{AFX_MSG_MAP(CTestClientDlg)
	ON_BN_CLICKED(IDC_BTNCONN, OnBtnconn)
	ON_BN_CLICKED(IDC_BTNDISCONN, OnBtndisconn)
	ON_BN_CLICKED(IDC_BTNSENDDATA, OnBtnsenddata)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestClientDlg message handlers

BOOL CTestClientDlg::OnInitDialog()
{
	//m_bFullScreen = FALSE;
	CDialog::OnInitDialog();

	// 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
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	//初始化输入值
	m_remoteHost = GetLocalIP();
	//m_remoteHost=_T("125.121.210.37");
	//m_remoteHost=_T("192.168.0.191");
	m_remotePort = 6000;
	UpdateData(FALSE);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CALLBACK CTestClientDlg::OnDisConnect(CWnd* pWnd)
{
	CTestClientDlg * pDlg = (CTestClientDlg*)pWnd;
	
	CStatic * pStatus = (CStatic *)pDlg->GetDlgItem(IDC_LBLCONNSTATUS);
	ASSERT(pStatus != NULL);
	pStatus->SetWindowText(_T("连接断开"));
	
	/*设置按钮可用属性*/
	CButton * pBtnConn =(CButton*)pDlg->GetDlgItem(IDC_BTNCONN);
	CButton * pBtnDisConn = (CButton*)pDlg->GetDlgItem(IDC_BTNDISCONN);
	CButton * pBtnSendData =  (CButton*)pDlg->GetDlgItem(IDC_BTNSENDDATA);
	ASSERT(pBtnConn != NULL );
	ASSERT(pBtnDisConn != NULL );
	ASSERT(pBtnSendData != NULL );
	pBtnConn->EnableWindow(TRUE);
	pBtnDisConn->EnableWindow(FALSE);
	pBtnSendData->EnableWindow(FALSE);
}

void CALLBACK CTestClientDlg::OnRead(CWnd* pWnd,const char * buf,int len )
{
	CTestClientDlg *pDlg=(CTestClientDlg*)pWnd;
	CEdit *pEdtRecv=(CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);
	ASSERT(pEdtRecv!=NULL);
	CString strRecv=buf;
	//show data 
	pEdtRecv->SetWindowText(strRecv);
}

void CALLBACK CTestClientDlg::OnError(CWnd* pWnd,int nErrorCode)
{
	AfxMessageBox(_T("客户端socket发生错误"));
}

void CTestClientDlg::OnBtnconn() 
{
	UpdateData(TRUE);

	//建立GPRS连接

	CWaitCursor *waitCursor=new CWaitCursor();
	GUID guidNetworkObject = {0};
	memset ( &guidNetworkObject, 0, sizeof(GUID) );
	int nIndex = 0;

	HRESULT hResult = ConnMgrMapURL ( _T("http://125.121.210.37:6000"), &guidNetworkObject, (DWORD*)&nIndex );
	if ( FAILED(hResult) )
	{
		nIndex = -1;
		DWORD dwLastError = GetLastError ();
		AfxMessageBox ( _T("Could not map a request to a network identifier") );
		return;
	}
	//GUID guidNet = {0x436ef144, 0xb4fb, 0x4863, 0xa0, 0x41, 0x8f, 0x90, 0x5a, 0x62, 0xc5, 0x72}; 
	BOOL bConn=m_ConnectManager.EstablishConnection(guidNetworkObject);
	//waitCursor->Restore();
	if (!bConn)
	{
		AfxMessageBox ( _T("GPRS Connection net failed") );
		return;
	}

	CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
	ASSERT(pStatus != NULL);
	pStatus->SetWindowText(L"GPRS连接成功");
	pStatus->UpdateWindow();

	UpdateData(FALSE);


	//设置m_tcpClient属性
	m_tcpClient.m_remoteHost = m_remoteHost;
	m_tcpClient.m_port = m_remotePort;

	m_tcpClient.OnDisConnect = OnDisConnect;
	m_tcpClient.OnRead = OnRead;
	m_tcpClient.OnError = OnError;

	//waitCursor->Restore();
	//建立与服务器端socket连接
	if (m_tcpClient.Connect())
	{
		waitCursor->Restore();
		CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
		ASSERT(pStatus != NULL);
		pStatus->SetWindowText(L"建立连接");
		UpdateData(FALSE);

		//打开客户端socket
		m_tcpClient.Open(this);
	}
	else
	{
		AfxMessageBox(_T("建立连接失败"));
		CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
		ASSERT(pStatus != NULL);
		pStatus->SetWindowText(L"连接断开");
		return;
	}

	if (waitCursor!=NULL)
	{
		delete waitCursor;
		waitCursor=NULL;
	}

	/*设置按钮可用属性*/
	CButton * pBtnConn =(CButton*)GetDlgItem(IDC_BTNCONN);
	CButton * pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
	CButton * pBtnSendData =  (CButton*)GetDlgItem(IDC_BTNSENDDATA);
	ASSERT(pBtnConn != NULL );
	ASSERT(pBtnDisConn != NULL );
	ASSERT(pBtnSendData != NULL );
	pBtnConn->EnableWindow(FALSE);
	pBtnDisConn->EnableWindow(TRUE);
	pBtnSendData->EnableWindow(TRUE);
	
}

void CTestClientDlg::OnBtndisconn() 
{
	if (m_tcpClient.Close())
	{
		CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
		ASSERT(pStatus != NULL);
		pStatus->SetWindowText(L"连接断开");
		CButton * pBtnConn =(CButton*)GetDlgItem(IDC_BTNCONN);
		CButton * pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
		CButton * pBtnSendData = (CButton*)GetDlgItem(IDC_BTNSENDDATA);
		ASSERT(pBtnConn != NULL );
		ASSERT(pBtnDisConn != NULL );
		ASSERT(pBtnSendData != NULL );
		pBtnConn->EnableWindow(TRUE);
		pBtnDisConn->EnableWindow(FALSE);
		pBtnSendData->EnableWindow(FALSE);
	}
	else
	{
		AfxMessageBox(_T("连接断开失败"));
	}
	
}

void CTestClientDlg::OnBtnsenddata() 
{	
	UpdateData(TRUE);
	SendData(m_sendData);	
}

void CTestClientDlg::SendData(CString strData)
{
	char * sendBuf;
	int sendLen=0;
	sendLen = wcstombs(NULL,strData,0);
	sendBuf = new char[sendLen+1];
	wcstombs(sendBuf,strData,sendLen);
	
	if (!m_tcpClient.SendData(sendBuf,sendLen))
	{
		AfxMessageBox(_T("发送失败"));
	}
	delete[] sendBuf;
	sendBuf = NULL;	
}

//得到本地的IP地址
CString CTestClientDlg::GetLocalIP()
{
	HOSTENT *LocalAddress;
	char	*Buff;
	TCHAR	*wBuff;
	CString strReturn = _T("");
	
	//创建新的缓冲区
	Buff = new char[256];
	wBuff = new TCHAR[256];
	
	//置空缓冲区
	memset(Buff, '\0', 256);
	memset(wBuff, TEXT('\0'), 256*sizeof(TCHAR));
	//得到本地计算机名
	if (gethostname(Buff, 256) == 0)
	{
		//转换成双字节字符串
		mbstowcs(wBuff, Buff, 256);
		//得到本地地址
		LocalAddress = gethostbyname(Buff);
		//置空buff
		memset(Buff, '\0', 256);
		//组合本地IP地址
		sprintf(Buff, "%d.%d.%d.%d\0", LocalAddress->h_addr_list[0][0] & 0xFF,
			LocalAddress->h_addr_list[0][1] & 0x00FF, LocalAddress->h_addr_list[0][2] & 0x0000FF, LocalAddress->h_addr_list[0][3] & 0x000000FF);
		//置空wBuff
		memset(wBuff, TEXT('\0'), 256*sizeof(TCHAR));
		//转换成双字节字符串
		mbstowcs(wBuff, Buff, 256);
        //设置返回值
		strReturn = wBuff;
	}
	else
	{
	}
	
	//释放Buff缓冲区
	delete[] Buff;
	//释放wBuff缓冲区
	delete[] wBuff;
	return strReturn;
}

⌨️ 快捷键说明

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