📄 dlgtcp.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 + -