VC++的TCP客户端程序

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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条快乐的闲鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值