CAsyncSocket使用总结

使用MFC快速实现网络编程 CAsyncSocket 阅读详情
 

一、 一些网络的基本概念


1. 同步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式;

2. 异步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式

3. 阻塞:指调用某函数时,直到该函数完成操作,才返回;否则一直阻塞在该调用上

4. 非阻塞:指调用某操作时,不管操作是否成功都立即返回,而不会挂在该操作上

CAsyncSocket属于异步非阻塞类;

CSocket是MFC在CAsyncSocket基础上派生的一个同步阻塞Socket的封装类

二、 CAsyncSocket的使用(伪码)


服务器端:


m_pListSocket = new CAsyncSocket();
m_pListSocket-> Create( 端口,地址); // 创建

m_pListSocket->Listen(); // 开始监听

m_pListSocket::OnAccept( ) // 有客户端请求连接时响应

...{

m_pSocket = new CAsyncSocket();
m_pListSocket-> Accept(m_pSocket); // 建立通信,成功后m_pSocket就用于发送和接受.

// m_pSocket 就相当于连接的那个客户端了

}

m_pSocket::OnRecive( int nErrorCode)

...{

if( nErrorCode == 0)

...{

Recevie(); // 接受客户端发送来的信息

}

CAsyncSocket::OnRecive( nErrorCode)

}

m_pSocket::OnSend()

...{

Send(); // 发送信息,该事件触发条件见下节

}

m_pListSocket->Close();

delete m_pListSocket;

delete m_pSocket;


客户端:


m_pClientSocket = new CAsyncSocket();
m_pClientSocket -> Create( 端口,地址); // 创建

m_pClientSocket->Connect(); // 连接服务器,最终将触发服务器的OnAccept();

m_ pClientSocket::OnConnect() // 当连接上服务器

...{

}

m_ pClientSocket::OnRecive( int nErrorCode)

...{

if( nErrorCode == 0)

...{

Recevie(); // 接受客户端发送来的信息

}

CAsyncSocket::OnRecive( nErrorCode)

}

m_pClientSocket::OnSend( int nErrorCode)

...{

Send(); // 发送信息

}

m_pClientSocket->Close();


三、 CAsyncSocket异步机制


由于CAsyncSocket采用的是异步非阻塞机制,所以你随时可以发包,也随时可能收到包。

发送、接收函数都是异步非阻塞的,顷刻就能完成,所以收发交错进行着。也正因为如此,仅调用它们并不能保障发送或接收的完成。

例如发送函数Send,调用它可能有3种结果:错误、部分完成、全部完成。其中错误又分两种情况:一种是由各种网络问题导致的失败,你需要马上决定是放弃本次操作,还是启用某种对策;另一种是“忙”,你实际上不用马上理睬。你需要调用GetLastError来判断是哪种情况,GetLastError返回WSAEWOULDBLOCK,代表“忙”,为什么当你Send得
到WSAEWOULDBLOCK却不用理睬呢?因为CAsyncSocket会记得你的SendWSAEWOULDBLOCK了,待发送的数据会写入CAsyncSocket内部的发送缓冲区,并会在不忙的时候自动调用OnSend,发送内部缓冲区里的数据。同样,如果Send只完成了一部分,你也不需要理睬,尚未发送的数据同样会写入CAsyncSocket内部的发送缓冲区,并在不“忙”的时候自动调用OnSend完成发送。

与OnSend协助Send完成工作一样,OnRecieve、OnConnect、OnAccept也会分别协助Recieve、Connect、Accept完成工作。这一切都通过消息机制完成。

在你使用CAsyncSocket之前,必须调用AfxSocketInit初始化WinSock环境,而AfxSocketInit会创建一个隐藏的CSocketWnd对象,由于这个对象由Cwnd派生,因此它能够接收Windows消息。一方面它会接受各个CAsyncSocket的状态报告,另一方面它能捕捉系统发出的各种SOCKET事件。所以它能够成为高层CAsyncSocket对象与WinSock底层之间的桥梁:例如某CAsyncSocket在Send时WSAEWOULDBLOCK了,它就会发送一条消息给CSocketWnd作为报告,CSocketWnd会维护一个报告登记表,当它收到底层WinSock发出的空闲消息时,就会检索报告登记表,然后直接调用报告者的OnSend函数。所以前文所说的CAsyncSocket会自动调用OnXxx,实际上是不对的,真正的调用者是CSocketWnd——它是一个CWnd对象,运行在独立的线程中。

四、 网络事件处理流程


在理解了上面的机制后, 让我们了解下CAsyncSocket的通信流程;


OnSend,除了在对方发送消息来的时候响应外,还会在缓冲区有空闲的时候自动触发;

如果每次发送的数据比较简单,不会造成WASEWOULDBLOCK(阻塞),不会触发OnSend;

因此小数据直接Send就行了,大数据就需要在OnSend判断数据发送是否正确;

如何手动触发OnSend()呢,采用AsyncSelect( FD_WRITE),通知CsocketWnd窗口处理写

数据操作;同样AsyncSelect(FD_READ)将通知CsocketWnd窗口当有消息传来的时候触发OnRecevie();

BOOL AsyncSelect( long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE ); // 请求Socket响应以上事件

五、 消息为何只接收一次


编程中遇到这个问题,发现很多人都遇到过这个问题。

症状如下:Socket连接后只能发送一次消息,发送第二次消息的时候,另一方就接收不到;

原因是:没有让Socket改变响应事件的发式

解决方法:在OnReceive()中,Receive()后调用AsyncSelect(FD_READ);


Void CMyAsyncSocket::OnReceive(int nErrorCode)

...{

Receive();

AsyncSelect(FD_READ);

}

或则 调用父类的OnReceive()


Void CMyAsyncSocket::OnReceive( int nErrorCode)

...{

Receive();

CAsyncSocket::OnReceive( nErrorCode);

}


六、 为何服务器Socket不监听


在创建服务器Socket的时候,只有采用SOCK_STREAM(字符流),Listen才能成功;

采用SOCK_DGRAM(数据报文)创建的Socket是面向无连接发式(UDP),所以Listen不成功(有待验证)

CAsyncSocket类实现网络通信 注意:CAsyncSocket ∷Accept()成员函数要用一个新的并且是空的CAsyncSocket对象作为它的参数,这里所说 的"空的"指的是这个新对象还没有调用Create()成员函数。如果是服务方套接字,则调用CAsyncSocket∷Listen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocket∷Accept()函数接受请求,建立连接。1)端口,UINT类型。1、构造一个CAsyncSocket对象,并用这个 对象的Create成员函数产生一个Socket句柄。 阅读详情

相关推荐

基于CAsyncSocket类的TCP通信实例讲解

服务器端 1.监听程序 //注意虚函数OnAccept()引入 //看到虚函数我想大家都能想到多态。顾名思义多态就是子类对父类方法的重写,以虚函数的方式重写。 class CNewSOCK; class CListen : public CAsyncSocket { public: CListen(); virtual ~CListen(); virtual void OnAccept...

weixin_41405284的博客 1559

MFC之CAsyncSocket详解

CAsyncSocket类是从Object类派生而来。CAsyncSocket对象称为异步套接字对象 使用CAsyncSocket进行网络编程,可以充分利用Windows操作系统提供的消息驱动机制,通过应用程序框架来传递消息,方便地处理各种网络事件。另一方面,作为MFC微软基础类库中的一员,CAsyncSocket可以和MFC的其他类融为一体,大大扩展了网络编程的空间,方便了编程。

小米的修行之路 1万+

【MFC】学习MFC day5 vs2019 基于对话框的MFC应用&使用CAsyncSocket类开发的TCP套接字应用程序

【MFC】学习MFC day5 vs2019 基于对话框的MFC应用程序&使用CAsyncSocket类开发的TCP应用 上一篇 今天的目标: 1、制作一个服务端和客户端应用程序 2、实现从客户端发送信息到服务端,并在服务端列表框(List Control)控件上显示 开始: 今天的代码文件Github的链接我也会放在博客的底部哟 日常偷个懒,使用上一篇博客的项目作为服务端,并进行一些修改。 再新建一个基于对话框的MFC项目作为客户端 以下表格是服务端和客户端交互的步骤 服务端 客户端

m0_46202128的博客 1133

CAsyncSocket详解

一、CAsyncSocket异步机制 当你获得了一个异步连接后,实际上你扫除了发送动作与接收动作之间的依赖性。所以你随时可以发包,也随时可能收到包。发送、接收 函数都是异步非阻塞的,顷刻就能完成,所以收发交错进行着,你可 以一直工作,保持很高的效率。 但是,正因为发送、接收函数都是异步非阻塞的,所以仅调用它们并 不能保障发送或接收的完成。 例如发送函数Send,调用它可能有3种结果:错

Barry的博客 7939

MFC CAsyncSocket类基本使用 - 1

win7, VC6;新建一个对话框工程;菜单选择:插入 - 类;先来做CAsyncSocket类 作为客户端; 新建类;类的类型为MFC类,基类为CAsyncSocket;如果使用mfc实现套接字,一般要从mfc提供的套接字类继承出自己的类,否则不好使; 生成相应类文件; 类向导里为CMysyncsock类添加OnConnect消息处理函数; 添加OnSend消息处理函数; 详细的MS参考和示例代码; https://docs.microsoft.com/zh-...

bcbobo21cn的专栏 1197

手把手教你用gmid方法设计二级运放:从理论到仿真全流程(附避坑指南)

本文详细介绍了使用gmid方法设计二级运放的全流程,从理论到仿真实践,特别针对初学者常见问题提供避坑指南。通过系统化的晶体管尺寸确定技术,帮助工程师在性能、功耗和面积之间找到最佳平衡点,适用于模拟集成电路设计中的关键模块开发。

weixin_29213525的博客 271

CAsyncSocket使用总结 收藏

CAsyncSocket使用总结 收藏 转载请注明出处blog.youkuaiyun.com/tianhai110 这几天都在研么MFC的套接字类CAsyncSocket的用法, 将一些心得和实践中遇到的问题总结一下。   一、        一些网络的基本概念 1.       同步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式; 2.       异步:指发

646

STM32CubeIDE串口打印浮点数踩坑实录:5分钟搞定printf输出小数(附完整配置截图)

本文针对STM32CubeIDE中串口无法打印浮点数的常见问题,提供了详细的解决方案。核心在于通过添加“-u _printf_float”链接器参数,启用标准库的浮点数格式化支持。文章附有完整的配置截图和步骤,并提供了系统性的排查清单,帮助开发者快速解决printf输出小数的问题。

weixin_29163797的博客 343

使用 CAsyncSocket 类实现聊天室程序

在本教程中,我们将使用 MFC 中的 CAsyncSocket 类来实现一个简单的聊天室程序。该程序允许多个用户连接到服务器,并实时发送和接收消息。我们将使用基于事件的编程模型来实现异步网络通信。1. 创建 MFC 应用程序使用 MFC 应用程序向导创建一个新的 MFC 应用程序。在向导中,选择“对话框应用程序”作为应用程序类型,并选择“多文档”或“单文档”作为文档类型。2. 添加 CAsyncSocket 类在项目中添加一个 CAsyncSocket 类,作为套接字通信的封装。

JAZJD的博客 1604

2024年全国大学生电子设计竞赛A题_AC-AC变换电路并联运行

AC-AC变换电路并联运行(A 题)【本科组】

qq_74395263的博客 7835

如何使你的直流电机闭环?(PID讲解)

看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

a2001444的博客 1万+

使用CAsyncSocket总结

最近想起CAsyncSocket这个类,记得很早以前用过,现在却想不起来怎么用了,翻了翻以前的代码又看了看msdn感觉这个类做简单的异步socket太简单了,几行代码就可以搞定,在此先做个总结。 不管是客户端和服务端都要从CAsyncSocket这个类派生一个类来重载一系列Socket消息事件函数比如 CAsyncSocket::OnAccept ...

weixin_34148508的博客 254

【3天快速入门WPF】1-从最简单的xaml开始

首先我们要知道xaml语法中声明即定义,意思就是“见到元素就相当于创建实例”,MainWindow.xaml的主干是一个元素里包含着一个 元素。这段程序就是在定义一个Window类的实例,这个实例的一个组成部分是一个Grid类的实例。

Zy100Papa的博客 1623

MFC中的CAsyncSocket的使用之一

CAsyncSocket类是从Object类派生而来。CAsyncSocket对象称为异步套接字对象 使用CAsyncSocket进行网络编程,可以充分利用Windows操作系统提供的消息驱动机制,通过应用程序框架来传递消息,方便地处理各种网络事件。另一方面,作为MFC微软基础类库中的一员,CAsyncSocket可以和MFC的其他类融为一体,大大扩展了网络编程的空间,方便了编程。 ...

weixin_44641897的博客 1238

使用python中pypower进行电力潮流计算

使用python中pypower进行电力潮流计算

总裁余(余登武)博客 4860

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

PPT里全是文字且很拥挤怎么办?本篇教你使用7种不同的排版让你的PPT瞬间变得高大上起来。

打造全国最全的AI Agent开发知识领域的博客 5021

CAsyncSocket,CSocket的使用方法

Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别。虽然同步好用,不费劲,但不能满足一些应用场合,其效率也很低。    也许初涉编程的人不能理解“同步(或阻塞)”和“异步(或非阻塞)”,其实简单两句话就能讲清楚,同步和异步往往都是针对一个函数来说的,“同步”就是函数直到其要执行的功能全部完成时才返回,而“异步”则是,函数

李昱成的专栏 2872

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 358

Windows Sockets:使用 CAsyncSocket 类

Windows Sockets:使用 CAsyncSocket 类 本文介绍 CAsyncSocket 类的用法。请注意,该类在非常低的级别上封装 Windows Sockets API。 CAsyncSocket 适合那些对网络通信细节很了解,但希望利用回调的便利通知网络事件的程序员使用。基于该假定,本文仅提供基本说明。如果想利用 Windows Sockets 方便地处理 MFC 应用程序

蓝剑专栏 955

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

在控制台程序中不能使用CAsyncSocket

在控制台程序中不能使用CAsyncSocket,接收不了OnAccept等事件,只好创建了一个隐藏的窗口

itclock的专栏 1455

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用MFC快速实现网络编程 CAsyncSocket

使用MFC快速实现网络编程 福州大学 王骏 ---- 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。由于C++语言对底层操作的优越性,许多文章都曾经介绍过用VC++进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用他来实现Socket编程,是

软件开发资料汇总 283

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: MFC程序得到本身路径
下一篇: wildcard linux
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值