MFC中CAsyncSocket网络编程学习总结
因为项目需要,最近学习了解了有关网络编程方面的知识,且重点学习了CAsyncSocket网络编程。和很多初学者一样,刚开始学习时通过在网上或书本上查阅资料,并通过模仿编写他们的代码进行尝试,但是尝试多次都以失败告终。一次偶然机会,在网上发现一篇文章(https://www.taodocs.com/p-108338347.html ),模仿其代码后最终实现了客户端和服务器端相互通信的功能,为了能让其他新手们能够少走弯路,决定写这篇文章,与大家分享自己的学习成果!
首先看看最后的效果,利用Visual Studio 2012编程软件,基于MFC对话框模式编写了客户端程序ChatClientDlg(界面如图1所示)和服务器端ChatServerDlg(界面如图2所示)程序。
注意在创建程序过程中,需在应用程序向导中勾选“Windows套接字”选项(如图3所示)。
若是忘记勾选此选项,可在相关文件中手动添加代码:
首先在“stdafx.h”中添加如下代码,
#include <afxsock.h> // MFC 套接字扩展
其次在“ChatClient.cpp”和“ChatServer.cpp”的InitInstance()函数中添加如下代码,
if (!AfxSocketInit())
{
AfxMessageBox(_T(“初始化错误!”));
return FALSE;
}
1、客户端代码
首先基于CAsyncSocket派生一个类CMySocket,并重载相关函数。
…“MySocket.h”…
class CMySocket : public CAsyncSocket
{
public:
CMySocket();
virtual ~CMySocket();
virtual void OnClose(int nErrorCode);
//virtual void OnSend(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnConnect(int nErrorCode);
};
…“MySocket.cpp”…
#include “stdafx.h”
#include “ChatClient.h”
#include “MySocket.h”
#include “ChatClientDlg.h”
CMySocket::CMySocket()
{
}
CMySocket::~CMySocket()
{
}
void CMySocket::OnClose(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CAsyncSocket::OnClose(nErrorCode);
if(nErrorCode==0)
{
CChatClientDlg p_Dlg;
p_Dlg=(CChatClientDlg)::AfxGetMainWnd();
p_Dlg->close1();
}
}
// void CMySocket::OnSend(int nErrorCode)
// {
// // TODO: 在此添加专用代码和/或调用基类
// /if(nErrorCode==0)
// {
// CChatClientDlg p_Dlg;
// p_Dlg=(CChatClientDlg)::AfxGetMainWnd();
// p_Dlg->send1();
// }/
// CAsyncSocket::OnSend(nErrorCode);
// }
void CMySocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
if(nErrorCode==0)
{
CChatClientDlg p_Dlg;
p_Dlg=(CChatClientDlg)::AfxGetMainWnd();
p_Dlg->recv1();
}
CAsyncSocket::OnReceive(nErrorCode);
}
void CMySocket::OnConnect(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
if(nErrorCode==0)
{
CChatClientDlg p_Dlg;
p_Dlg=(CChatClientDlg)::AfxGetMainWnd();
p_Dlg->connect1();
}
CAsyncSocket::OnConnect(nErrorCode);
}
其次编写对话框程序:
…“ChatClientDlg.h”…
#pragma once
//#include “afxwin.h”
#include “MySocket.h”
// CChatClientDlg 对话框
class CChatClientDlg : public CDialogEx
{
// 构造
public:
CChatClientDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_CHATCLIENT_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_