MFC实现Socket通信(TCP Server&Client)

MFC实现Socket通信(TCP Server&Client)



前言

最近有一个项目要求用MFC编写,需要用到网络通信,参考了各种资料,整理一下,也许下次用得上。


一、上效果

一个工程,支持使用Server或Client,测试相互通信正常。在这里插入图片描述

在这里插入图片描述

二、简要步骤

1.新建工程

新建一个基于对话框的简单工程,命名SocketNet。

2.添加类

类向导中添加一个基于CAsyncSocket的类。

MSocket.h:

#pragma once
#include <afxsock.h>            // MFC 套接字扩展

class CSocketNetDlg;
class MSocket : public CAsyncSocket
{
public:
	MSocket();
	CSocketNetDlg* m_dlg;
	virtual ~MSocket();
	virtual void OnAccept(int nErrorCode);	//Server
	virtual void OnConnect(int nErrorCode);	//Client
	virtual void OnReceive(int nErrorCode);
	virtual void OnClose(int nErrorCode);
	void SetDlg(CSocketNetDlg* dlg);
};

MSocket.cpp:

// MSocket.cpp: 实现文件
#include "stdafx.h"
#include "MSocket.h"
#include "SocketNet.h"
#include "SocketNetDlg.h"

MSocket::MSocket()
{
}

MSocket::~MSocket()
{
}

// MSocket 成员函数
void MSocket::OnAccept(int nErrorCode)
{
	if (nErrorCode) {
		AfxMessageBox("连接失败,请重试");
		return;
	}
	m_dlg->OnAccept();
	CAsyncSocket::OnAccept(nErrorCode);
}

void MSocket::OnConnect(int nErrorCode)
{
	if (nErrorCode) {
		AfxMessageBox("连接失败,请重试");
		return;
	}
	m_dlg->OnConnect();
	CAsyncSocket::OnConnect(nErrorCode);
}

void MSocket::OnReceive(int nErrorCode)
{
	m_dlg->OnReceive();
	CAsyncSocket::OnReceive(nErrorCode);
}

void MSocket::OnClose(int nErrorCode)
{
	m_dlg->OnClose();
	CAsyncSocket::OnClose(nErrorCode);
}

void MSocket::SetDlg(CSocketNetDlg * dlg)
{
	m_dlg = dlg;
}

3.通信实现

SocketNetDlg.h部分代码:

public:
	MSocket* m_ServerSocket;
	MSocket* m_ListenSocket;
	MSocket* m_ClientSocket;
	
	void OnAccept();
	void OnConnect();
	void OnReceive();
	void OnClose();
	void SocketReset();

SocketNetDlg.cpp连接代码:

if (!AfxSocketInit()) {
		MessageBox("WindowSocket init failed!", "Receive", MB_ICONSTOP);
		return;
	}

	if (1 == m_nServer)
	{
		m_ListenSocket = new MSocket;
		m_ListenSocket->SetDlg(this);
		sIP = "127.0.0.1";
		sPort = 7600;
		m_ListenSocket->Create(sPort, 1, FD_ACCEPT, sIP);//创建服务器监听Socket
		m_ListenSocket->Listen(20);
	}
	else
	{
		m_ClientSocket = new MSocket;
		m_ClientSocket->SetDlg(this);
		//连接服务器//
		sIP = "127.0.0.1";
		sPort = 7600;
		m_ClientSocket->Create();
		m_ClientSocket->Connect(sIP, sPort);
	}

SocketNetDlg.cpp各种响应函数:

void CSocketNetDlg::OnAccept()
{
	if (1 == m_nServer)
	{
		m_ServerSocket = new MSocket;
		m_ServerSocket->SetDlg(this);
		m_ListenSocket->Accept(*m_ServerSocket);
		m_ServerSocket->AsyncSelect(FD_READ | FD_CLOSE);
		GetDlgItem(IDC_EDIT_RECV)->SetWindowText("收到连接请求");
	}
}

void CSocketNetDlg::OnConnect()
{
	//连接成功//
	GetDlgItem(IDC_EDIT_RECV)->SetWindowText("连接服务器成功");
}

void CSocketNetDlg::OnReceive()
{
	char szTemp[2000];
	if (1 == m_nServer)
	{
		int n = m_ServerSocket->Receive(szTemp, 200);
		szTemp[n] = '\0';
	}
	else
	{
		int n = m_ClientSocket->Receive(szTemp, 200);
		szTemp[n] = '\0';
	}
	CString sTemp;
	sTemp.Format("收到: %s", szTemp);
	GetDlgItem(IDC_EDIT_RECV)->SetWindowText(sTemp);
}

void CSocketNetDlg::OnClose()
{
	if (1 == m_nServer)
	{
		m_ServerSocket->Close();
		if (m_ServerSocket != NULL) {
			delete m_ServerSocket;
			m_ServerSocket = NULL;
		}
	}
	else
	{
		m_ClientSocket->Close();
		SocketReset();
	}
}

void CSocketNetDlg::SocketReset()
{
	if (1 == m_nServer)
	{
		if (m_ServerSocket != NULL) {
			delete m_ServerSocket;
			m_ServerSocket = NULL;
		}
		if (m_ListenSocket != NULL) {
			delete m_ListenSocket;
			m_ListenSocket = NULL;
		}
	}
	else
	{
		if (m_ClientSocket != NULL) {
			delete m_ClientSocket;
			m_ClientSocket = NULL;
		}
	}
}

最后

工程下载:CSDN百度云盘(提取码:h5nh)

需要的也可以私信,免费分享。

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
MFC(Microsoft Foundation Class)是一套用于编写Windows应用程序的类库,它提供了许多用于创建用户界面、处理消息和数据管理的类。要在MFC实现TCP通信,可以使用MFC提供的套接字类库来创建TCP套接字,建立起客户端和服务器之间的连接。 首先,我们需要包含MFC的套接字类库头文件,并初始化套接字库。然后,创建一个套接字对象,使用Create函数创建一个TCP套接字。接下来,使用Connect函数连接到服务器的IP地址和端口号。如果连接成功,可以使用Send和Receive函数进行数据的发送和接收。 在服务器端,也是需要创建一个套接字对象,使用Create函数创建一个TCP套接字。然后,使用Bind函数将套接字绑定到一个IP地址和端口号,并使用Listen函数开始监听连接请求。当有客户端请求连接时,使用Accept函数接受连接,并使用Send和Receive函数进行数据的发送和接收。 通过以上步骤,我们就可以实现基于TCP通信。需要注意的是,MFC的套接字类库提供了许多其他的功能和函数,如设置超时时间、关闭套接字等,可以根据实际需求进行使用和配置。 总结起来,要在MFC实现TCP通信,需要包含MFC的套接字类库头文件,创建套接字对象,使用相应的函数进行连接、发送和接收数据。在服务器端需要额外的步骤,如绑定、监听和接受连接请求。通过了解和使用MFC的套接字类库的相关函数,即可实现TCP通信
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值