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

📄 dlgtcp.cpp

📁 周立功WinCE光盘资料
💻 CPP
字号:
// DLGTCP.cpp : implementation file
//

#include "stdafx.h"
#include "Magic2410.h"
#include "DLGTCP.h"

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

/////////////////////////////////////////////////////////////////////////////
// DLGTCP dialog


DLGTCP::DLGTCP(CWnd* pParent /*=NULL*/)
	: CDialog(DLGTCP::IDD, pParent)
{
	//{{AFX_DATA_INIT(DLGTCP)
	m_RemoteHost = _T("");
	m_RemotePort = 0;
	m_SendEdit = _T("Hello, This is 192.168.0.231.");
	//}}AFX_DATA_INIT
	m_RemoteHost = "192.168.0.16";
	m_RemotePort = 1011;

	m_strRecDisp = _T("");
	m_Socket = INVALID_SOCKET;
	m_ExitThreadEvent = NULL;
	
	m_ButDisConnect.EnableWindow(FALSE);
}


void DLGTCP::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DLGTCP)
	DDX_Control(pDX, IDC_DISCONNECT, m_ButDisConnect);
	DDX_Control(pDX, IDC_CREATE_CONNECT, m_ButCreConnect);
	DDX_Text(pDX, IDC_REMOTEHOST, m_RemoteHost);
	DDX_Text(pDX, IDC_REMOTEPORT, m_RemotePort);
	DDX_Text(pDX, IDC_SEND_EDIT, m_SendEdit);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DLGTCP, CDialog)
	//{{AFX_MSG_MAP(DLGTCP)
	ON_BN_CLICKED(IDC_CREATE_CONNECT, OnCreateConnect)
	ON_BN_CLICKED(IDC_DISCONNECT, OnDisconnect)
	ON_BN_CLICKED(IDC_CLEAR_RECDISP, OnClearRecdisp)
	ON_BN_CLICKED(IDC_SEND, OnSend)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DLGTCP message handlers

void DLGTCP::OnCreateConnect() 
{
	// TODO: Add your control notification handler code here
	WSADATA wsa;
	DWORD IDThread;

	if (WSAStartup(MAKEWORD(1,1), &wsa) != 0)					/* WinSock 初始化 */
	{
		MessageBox(_T("加载套接字失败!"));
		return;
	}

	m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);		/* 创建TCP套接字 */
	if (m_Socket == INVALID_SOCKET)
	{
		WSACleanup();
		MessageBox(_T("创建套接字失败!"));	
		return;
	}

	UpdateData(TRUE);
	
	// 初始化远程 IP 地址及端口
	m_RemoteAddr.sin_family = AF_INET; 						
	m_RemoteAddr.sin_port = htons(m_RemotePort);				/* 远程端口地址 */

	char charRemoteHost[255];
	ZeroMemory(charRemoteHost, 255);
	int len = m_RemoteHost.GetLength(); 
	if (len > 255)
	{
		MessageBox(_T("输入远程IP长度超长!"));
		return;		
	}

	// 将 Unicode 字符串转换为字节
	LPTSTR pStr = m_RemoteHost.GetBuffer(len);
	WideCharToMultiByte(CP_ACP, 0, pStr, len, charRemoteHost, len, NULL, NULL);

	DWORD ipaddress = inet_addr(charRemoteHost);				/* 远程 IP 地址 */
 	if ((INADDR_NONE == ipaddress) || (0 == ipaddress))
	{
		MessageBox(_T("输入远程IP地址格式不正确!"));
		return;
	}
	m_RemoteAddr.sin_addr.s_addr = ipaddress;

	int ret = connect(m_Socket, (struct sockaddr *)&m_RemoteAddr, sizeof(m_RemoteAddr));
	if (ret == SOCKET_ERROR)
	{
		MessageBox(_T("连接TCP服务器失败!"));
		return;
	}

	DWORD ul = 1;
	ioctlsocket(m_Socket, FIONBIO, &ul);						/* 设置通信模式为异步模式 */


	m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);	/* 创建 UDP 接收线程退出事件 */

	// 创建 UDP 接收线程
	HANDLE hRecvThread = CreateThread(0, 0, TCPRecvTread, this, 0, &IDThread);
	if (hRecvThread == NULL) 
	{
		closesocket(m_Socket);
		MessageBox(_T("创建TCP接收线程失败!"));
	}
	CloseHandle(hRecvThread);

	m_ButDisConnect.EnableWindow(TRUE);
	m_ButCreConnect.EnableWindow(FALSE);
}

void DLGTCP::OnDisconnect() 
{
	// TODO: Add your control notification handler code here
	if (m_ExitThreadEvent != NULL)
	{
		SetEvent(m_ExitThreadEvent);					/* 设置接收线程退出事件, 通知线程退出 */
		Sleep(1000);
		CloseHandle(m_ExitThreadEvent);					/* 关闭线程退出事件句柄 */
	}

	if (m_Socket != INVALID_SOCKET)
	{	
		if (closesocket(m_Socket) == SOCKET_ERROR)	/* 关闭 Socket */	
		{
			MessageBox(_T("关闭Socket失败!"));
			return;
		}
		m_Socket = INVALID_SOCKET;

		if (WSACleanup() == SOCKET_ERROR)				/* */
		{
			MessageBox(_T("释放Socket资源失败!"));
		}
	}

	m_ButDisConnect.EnableWindow(FALSE);
	m_ButCreConnect.EnableWindow(TRUE);
}

void DLGTCP::OnClearRecdisp() 
{
	// TODO: Add your control notification handler code here
	m_strRecDisp = _T("");
	CEdit *pRecDispEdit = (CEdit*)GetDlgItem(IDC_REC_DISP); /* 取得控件指针 */
														
	pRecDispEdit->SetWindowText(m_strRecDisp);				/* 在窗口显示出来 */
}

void DLGTCP::OnSend() 
{
	// TODO: Add your control notification handler code here
	int nErrorCode;
	int cnt = 0, actlen = 0;

	if (m_Socket == NULL)
		return;

	UpdateData(TRUE);
 	int sendlen = m_SendEdit.GetLength();				 /* 取得输入字符串长度 */
	char *psendbuff = new char[sendlen];

	for(int i = 0; i < sendlen;i++)
		psendbuff[i] = (char)m_SendEdit.GetAt(i);		 /* 转换为单字节字符 */
	
	while(cnt < sendlen)
	{
		actlen = send(m_Socket, psendbuff + cnt, sendlen - cnt, 0);
		if (actlen == SOCKET_ERROR )
		{
			MessageBox(_T("TCP 数据发送失败!"));
			nErrorCode = WSAGetLastError();
			delete[] psendbuff;
			return;
		}

		cnt = cnt + actlen;
		if (cnt < sendlen)
			Sleep(1000);
	}
	
	delete[] psendbuff;
}

void DLGTCP::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	OnDisconnect();
}

/*******************************************************************************************
函数名称: CALLBACK CUDPExampleDlg::OnUdpRecv
描    述: UDP 接收数据成功回调函数
输入参数: 无
输出参数: 无
返    回: FALSE: 失败;    TRUE: 成功
********************************************************************************************/
void CALLBACK DLGTCP::OnTcpError(CWnd *pWnd, int nErrorCode)
{
	
}

void CALLBACK DLGTCP::OnTcpRecv(CWnd *pWnd, char *buf, int buflen)
{
	CString strTmp;

	DLGTCP * pDlg = (DLGTCP*)pWnd;
	CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_REC_DISP);
														/* 取得控件指针 */
	for (int i = 0; i < buflen; i++)
	{
		strTmp.Format(_T("%c"), *buf);
		pDlg->m_strRecDisp += strTmp;
		buf++;
	}

	pRecvStrEdit->SetWindowText(pDlg->m_strRecDisp);	/* 在窗口显示出来 */
}

/*******************************************************************************************
函数名称: CUDPExampleDlg::UdpRecvTread
描    述: UDP 接收线程
输入参数: LPVOID lparam: 线程参数,创建线程时传入
输出参数: 无
返    回: 0: 线程退出, 返回值没特殊含义
********************************************************************************************/
DWORD DLGTCP::TCPRecvTread(LPVOID lparam)
{
	fd_set fdRead;
	TIMEVAL aTime;
	aTime.tv_sec = 1;
	aTime.tv_usec = 0;
	//SOCKADDR_IN tmpAddr;
	int iErrorCode;
	int ret;
	DLGTCP *pDlg = (DLGTCP *)lparam;

	while(TRUE)
	{
		if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)
			break;

		FD_ZERO(&fdRead);
		FD_SET(pDlg->m_Socket, &fdRead);
		ret = select(0, &fdRead, NULL, NULL, &aTime);
		if (ret == SOCKET_ERROR)
		{
			iErrorCode = WSAGetLastError();
			pDlg->OnTcpError(pDlg, iErrorCode);
			break;
		}

		if (ret > 0)
		{
			if (FD_ISSET(pDlg->m_Socket, &fdRead))			/* 检查该socket是否是fdRead中的一员 */
			{
				char *recvBuf = new char[1024];
				int recvlen = recv(pDlg->m_Socket, recvBuf, 1024, 0);
				if ((recvlen == SOCKET_ERROR) || (recvlen == 0))
				{
					iErrorCode = WSAGetLastError();
					pDlg->OnTcpError(pDlg, iErrorCode);
					delete[] recvBuf;
					break;
				}
				else 
				{		
					pDlg->OnTcpRecv(pDlg, recvBuf, recvlen);			 /* 正确接收回调函数 */
					delete[] recvBuf;
				}

			}// end of if (FD_ISSET(pDlg->m_Socket, &fdRead))

		}// end of if (ret > 0)
		
	}// end of while(TRUE)

	return 0;
}

⌨️ 快捷键说明

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