VS2013 MFC框架下,使用socket套接字实现TCP通信客户端代码的编写,主要实现服务器与客户端一对一的双向通信,接上一篇服务器端的程序。
第一步:创建MFC对话框,选中window套接字,如下图所示:
第二步:在对话框窗口添加连接服务器、退出、发送按钮,对应的ID为IDC_CONNECT、IDCANCEL、IDC_SEND,添加四个文本框分别用来显示连接的网络IP、连接的端口号、发送数据、接收数据,对应的IDC_IP、IDC_PORT、IDC_SENDSJ、IDC_RECEIVE,其中接收的数据文本框为不可见状态,发送数据、接收数据文本框添加垂直滚动条,具体界面显示如下图所示:
第三步:给不同的控件添加不同的变量,网络IP添加数值型变量,类型为CString,名称为m_ip,端口号文本框添加数值型变量,类型UINT,名称m_port,输入的值为服务端得到端口号;发送数据文本框添加数值型变量,类型CString,名称m_sendsj。本文在此只介绍网络IP的设置方法如下图所示,其余两个控件设置方法一样。
1.右键网络连接IP文本框,选择添加变量。
2.数值型变量修改类别为Value,控件型变量为Control。
3.设置变量类型为CString,添加变量名m_ip,即可完成控件变量的设置。
第四步:在类视图中右键选择类向导,然后添加类,选择MFC类,新建的类继承的基类为CSocket,新建的类名为CClientSocket,具体操作如下。
第五步:添加事件响应函数OnReceive(),实现服务器消息的接收。添加过程如下图所示。
第六步:编写 ClientSocket.h中的程序代码,代码如下。
#pragma once
// CClientSocket 命令目标
class CClientSocket : public CSocket
{
public:
CClientSocket();
virtual ~CClientSocket();
virtual void OnReceive(int nErrorCode);
BOOL SendMSG(LPSTR lpBuff, int nlen);
};
第七步:编写ClientSocket.cpp中的程序代码,代码如下。
#include "stdafx.h"
#include "KHD.h"
#include "ClientSocket.h"
#include "KHDDlg.h"
// CClientSocket
CClientSocket::CClientSocket()
{
}
CClientSocket::~CClientSocket()
{
}
void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
char* pData = NULL;
pData = new char[1024];
memset(pData, 0, sizeof(char)* 1024);
UCHAR leng = 0;
CString str;
leng = Receive(pData, 1024, 0);
str = pData;
((CKHDDlg*)theApp.GetMainWnd())->SetDlgItemText(IDC_RECEIVE, str);
delete pData;
pData = NULL;
CSocket::OnReceive(nErrorCode);
}
BOOL CClientSocket::SendMSG(LPSTR lpBuff, int nlen)
{
if (Send(lpBuff, nlen) == SOCKET_ERROR)
{
AfxMessageBox(_T("发送错误!"));
return FALSE;
}
return TRUE;
}
第八步:编写KHDDlg.h中的程序代码,代码如下。
#pragma once
#include "afxwin.h"
// CKHDDlg 对话框
class CKHDDlg : public CDialogEx
{
// 构造
public:
CKHDDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_KHD_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
public:
bool m_connect;
CClientSocket* pSock;
struct sockaddr_in client;
int clientAddrLen = sizeof(client);
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CString m_ip;
UINT m_port;
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnBnClickedConnect();
afx_msg void OnBnClickedSend();
CButton m_con;
CString m_sendsj;
};
第九步:编写KHDDlg.cpp中的连接服务器程序代码,通过双击对话框中的打开服务器按钮添加消息处理函数,代码如下。
void CKHDDlg::OnBnClickedConnect()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_connect)
{
m_connect = false;
pSock->Close();
delete pSock;
pSock = NULL;
m_con.SetWindowText(_T("连接服务器"));
UpdateData(false);
return;
}
else
{
CString str;
pSock = new CClientSocket();
if (!pSock->Create())
{
AfxMessageBox(_T("创建套接字失败!"));
return;
}
getsockname(*pSock, (struct sockaddr*)&client, &clientAddrLen);
str.Format("client:client adress = %#x :%d en %d", client.sin_addr.s_addr, client.sin_port, clientAddrLen);
//MessageBox(str);
}
if (!pSock->Connect(m_ip, m_port))
{
AfxMessageBox(_T("连接服务器失败!"));
return;
}
else
{
m_connect = true;
m_con.SetWindowText(_T("断开服务器"));
UpdateData(false);
}
}
第十步:编写KHDDlg.cpp中的发送数据程序代码,代码如下。
void CKHDDlg::OnBnClickedSend()
{
// TODO: 在此添加控件通知处理程序代码
if (!m_connect)return;
UpdateData(true);
if (m_sendsj != "")
{
char* pBuff = new char[m_sendsj.GetLength() * 2];
memset(pBuff, 0, m_sendsj.GetLength() * 2);
strncpy(pBuff, m_sendsj, m_sendsj.GetLength() + 1);
pSock->SendMSG(pBuff, m_sendsj.GetLength() * 2);
}
}
运行结果如下图所示:
运行此程序,即可实现TCP套接字客户端程序的编写,多个系统通信的程序请看博主的其他文章!直接购买此程序点击此链接即可https://download.csdn.net/download/weixin_49419240/18836637