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)
需要的也可以私信,免费分享。