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

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


目录

  • MFC实现Socket通信(TCP Server&Client)
  • 前言
  • 一、上效果
  • 二、简要步骤
    • 1.新建工程
    • 2.添加类
    • 3.通信实现
  • 最后


前言

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


一、上效果

一个工程,支持使用Server或Client,测试相互通信正常。MFC实现Socket通信(TCP Server&Client)_第1张图片

MFC实现Socket通信(TCP Server&Client)_第2张图片

二、简要步骤

1.新建工程

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

2.添加类

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

MSocket.h:

#pragma once
#include             // 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 或 Gitcode
需要的也可以私信或留言邮箱,免费分享。

你可能感兴趣的:(MFC,mfc,tcp/ip,c++)