002篇是采用传统方式创建,不适应动态的网络环境,服务器为客户端保留着断开连接时的套接字,不够灵活。而采用指针机制不仅可以更加灵活性,而且能使代码更集中,更具有条理性。将其转变成指针机制。功能及运行保持一致。(前文链接:https://www.cnblogs.com/maxonzou/articles/10573105.html)

1、通信套接字实例改动。

1)客户端:在ClientSocket类中新增函数pGetDlg用户快速获取主窗口指针,并声明一个Dlg类的指针用于绑定,在CXXXDlg.h中声明对象m_ClientSocket改成指针型。

2)服务端:并新增一个Dlg类的指针用于实现函数快速获取指针。在CXXXDlg.h中声明创对象m_ListenSocket/m_ServerSocket改成指针型。

Tips:此时应将Socket.h中的Dlg.h头文件改成类声明class CXXXDlg,否则会导致头文件循环引用出错。

 // XXXSocke.h中

 class CXXXDlg;     //类声明,创建指针对象
class XXXSocket : public CAsyncSocket
{
public:
CXXXXDlg *m_dlg;
void pGetDlg(CXXXXDlg*dlg);
......
}
11 //在CXXXXSocket中实现函数,其实pGetFlg就是将Ccase003Dlg* plist=(Ccase003Dlg*)(AfxGetApp()->m_pMainWnd)封装成函数。
12 void CxxxxSocket::pGetDlg(CxxxxDlg* dlg)
13 {
14  m_dlg=dlg;
15 }

2、将通信事件集中到Dlg类中,并对Socket对象初始化。

因指定为指针型,在Dlg.cpp的初始化InitInstance函数中中进行指针初始化(=NULL),在Socket对象中我们指定了窗口类指针,便是用于回调在Dlg类中实现函数。重写退出函数(释放所有对象指针)。

  class CXXXXDlg : public CDialog
{
public:
CXXXXSocket * m_xxxxsocket;  //客户端一个,服务器端两个,一个用于监听,一个用于服务
void OnReceive();
void OnClose();
void OnConnect();
void Reset(); //用于释放套接字对象
......
}
//在Dlg.cpp中实现Reset函数,即删除套接字对象,并将指针赋空
void CXXXDlg::Reset()
{
if(m_xxxxSocket!=NULL)
{
Delete m_xxxxSocket;
m_xxxxSocket=NULL;
}
} void CXXXXDlg::OnBnClickedCancel() //采用指针机制,在退出时需确保指针释放
{
// TODO: 在此添加控件通知处理程序代码
Reset();
OnCancel();
}

  此时精简Socket类中的函数,使用m_dlg->OnClose()方式,将对应函数中的操作语句(除了判定语句外)全部转移到Dlg类中相应函数体,这样对于控件变量就无需再增加指针定向了。注意OnReceive/OnAccept中使用的Receive/Accept是Socket的成员函数,故转移后应增加“m_clientsocket->" 或"m_serversocket->”补充。

3、实例化套接字对象,并更新Dlg.cpp中的函数

1)客户端:在连接时应实例化一个Socket对象,并绑定指针到主窗口,将c_xxxxSocket的"."操作全部切换成"->"操作;

2)服务器端:在开始监听时创建监听对象,在Accept中创建服务对象,同时绑定指针到主窗口。将c_xxxxSocket的"."操作全部切换成"->"操作。

 {
m_XXXXsocket = new CXXXXSocket;
m_XXXXsocket->pGetDlg(this);
}

4、运行调试。

客户端在运行后会有提示在CXXXXSocket.cpp类中存在未声明对象,此时发现原来是之前为了避免连接失败不清空套接字增加的语句导致“plist->m_clientsocket->Close();”删除。

客户端:在所有执行m_xxxxSocket->Close()语句后追加Reset()彻底释放套接字对象。

服务器端:在所有执行m_xxxxSocket->Close()语句后释放套接字对象。因为有两个Socket对象,所以要分别释放,不能直接调用Reset。

  if(m_XXXXsocket!=NULL)
{
delete m_XXXXsocket;
m_XXXXsocket=NULL;
}

5、小结:会者不难,先了解原理,然后再码代码。

  1)指针机制的使用注意及时释放指针,尽量将代码集中在主程序文件中;

2)异步通信:服务器端打开监听(Listen),触发Accept接收请求,客户端发出连接,触发connect发送请求,至此可实现连接。发送信息使用Send,有信息触发相应端Receive接收显示信息。

003之MFCSocket异步编程(指针机制)的更多相关文章

  1. 002之MFCSocket异步编程

    当今的网络程序通用体系结构大多为C/S模式,服务器监听收到来自客户端的请求,然后响应并作出应答. 界面对话框如下,输入IP信息进行通信后再进行连接,连接成功即可开始通信.左侧为客户端,右侧为服务端. ...

  2. 从CompletableFuture到异步编程设计

    从CompletableFuture到异步编程设计,笔者就分为2部分来分享CompletableFuture异步编程设计,前半部分总结下CompletableFuture使用实践,后半部分分享下Com ...

  3. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  4. 【nodejs学习】3.进程管理及异步编程

    进程管理 1.调用终端命令实现目录目录拷贝 var child_procress = require('child_procress'); var util = require('util'); fu ...

  5. Python Twisted系列教程2:异步编程初探与reactor模式

    作者:dave@http://krondo.com/slow-poetry-and-the-apocalypse/  译者:杨晓伟(采用意译) 这个系列是从这里开始的,欢迎你再次来到这里来.现在我们可 ...

  6. 004之MFCSocket同步编程(指针机制)

    异步与同步通信相比较,前者是非阻塞模式,后者是阻塞模式.有关两者差异在此博主中有详细讲解,推荐:https://www.cnblogs.com/wzsblogs/p/4671559.html. 采用同 ...

  7. 【转】C#异步编程及其同步机制

    C#异步编程及其同步机制 本篇文章涵盖一下几部分内容: 1. 什么是异步编程,为什么会需要异步编程 2. .NET下的异步编程及其发展 3. .NET线程同步机制及线程间数据封送 4. 异步模式 5. ...

  8. C#实现异步编程的两个简单机制(异步委托&定时器)及Thread实现多线程

    创建线程的常用方法:异步委托.定时器.Thread类 理解程序.进程.线程三者之间的区别:简而言之,一个程序至少有一个进程,一个进程至少有一个线程进程就是在内存中运行的程序(即运行着的程序):一个进程 ...

  9. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

随机推荐

  1. 外网ssh内网Linux服务器holer实现

    外网ssh访问内网linux 内网的主机上安装了Linux系统,只能在局域网内访问,怎样从公网也能ssh访问本地Linux服务器? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安 ...

  2. linux 查看进程下进程的数量

    1.pstree -p 14686(PID)  获取到nginx的四个子进程(或 ps -ef |grep nginx) 2. cat /proc/15178(PID)/status threads即 ...

  3. 20155219付颖卓《网络对抗》逆向及Bof基础

    实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...

  4. zabbix_agent添加到系统服务启动(八)

    Centos6.5上安装了zabbix_agent后,需要把zabbix_agent添加到系统服务启动,要不然每次要一长串路径再启动,挺麻烦的. 步骤: 1)拷贝zabbix解压包里的zabbix_a ...

  5. redis 的备份策略,最好使用:RDB-AOF 混合持久化

    相关资料: Redis 4.0 新功能简介:RDB-AOF 混合持久化:http://blog.huangz.me/2017/redis-rdb-aof-mixed-persistence.html ...

  6. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)

    如下表   模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 ...

  7. Http原理与实践

    Http原理 一.使用Http协议最简单的例子 1.输入URL打开网页 2.AJAX获取数据 3.img标签加载图片 二.Cache-Control 1.public.private 2.must-r ...

  8. [转]linux下编译boost.python

    转自:http://blog.csdn.net/gong_xucheng/article/details/25045407 linux下编译boost.python 最近项目使用c++操作python ...

  9. 理念的创新——从keep和得到app谈起

    浅谈keep创新之路 不得不说,这是一个健康越来越重要的时代,也是身体素质越来越被重视的一个年代.随着交通工具日新月异地发展,我们不太需要再徒步远行,甚至连骑自行车的机会也越来越少,这给我们的出行带来 ...

  10. oData 排序字段生成

    跟踪SQL 发现生成的SQL中所有的字段都进行了排序,查看OData原代码,发现如果实体有Key,就按照Key asc 加上指定字段进行排序 属性 EnsureStableOrdering可以控制是否 ...