孙鑫VC学习笔记:第十六讲 (三) 用异步套接字编写聊天程序
基于消息的异步套接字
Windows套接字在两种模式下执行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回程序(将控制权交还给程序)。而在非阻塞模式下,Winsock函数无论如何都会立即返回。
Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略。
Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择,当使用它登记的网络事件发生时,Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。
--------------------------------------------------------------------------------
用异步套接字编写一个基于MFC对话框的聊天程序:
1.新建一个基于MFC项目工程Chat,如下
2.加载套接字库,有下面两种方法,上一讲中我们用的是AfxSocketInit()加载套接字库,但是只能加载1.1版本的套接字库。今天我们使用WSAStartup()加载套接字库版本2。
1)在预编译头文件中包含头文件:winsock2.h(不是Afxsock.h)
2)链接库文件ws2_32.lib,如果不链接将会编译链接出错
3)在CChatApp::InitInstance()函数中加载套接字库版本2
4)为CChatApp增加析构函数,调用WSACleanup()来终止对套接字库的使用。
Windows中增加的扩展函数都会在前面加上前缀WSA。
--------------------------------------------------------------------------------
3.初始化套接字,
1)在CChatDlg类中添加成员变量SOCKET m_socket;
在构造函数中初始化变量m_socket;在析构函数中调用closesocket(m_socket)关闭套接字。
2)添加初始化套接字库的成员函数BOOL InitSocket();
步骤如下:
1。新建套接字
2。新建地址。
3。绑定
4。请求一个windows的基于消息的网络事件通知
5。在BOOL CChatDlg::OnInitDialog()中调用BOOL CChatDlg::InitSocket()
--------------------------------------------------------------------------------4.编写接收端程序
自定义消息响应函数步骤:
1)在ChatDlg.h中定义#define UM_SOCK WM_USER+1
2)消息原型声明
3)在添加消息映射
4)实现消息响应函数
--------------------------------------------------------------------------------
5.编写发送端程序
最后为按钮添加消息实现代码:
注意,
此程序的接收端和发送端是在同一个线程下完成的,
如果我们采用阻塞套接字会因为接收函数的调用而使主线程暂停运行。
这样我们采用异步选择的机制完成了主线程的接收端和发送端,
而不需要用多个线程,这个可以提高程序的性能。
孙鑫VC学习笔记:第十六讲 (三) 用异步套接字编写聊天程序相关推荐
- 孙鑫VC学习笔记:第七讲
七.对话框 2006年8月5日 14:25 因为笔记是用OneNote做的,上传以后为看不到图片,于是我截图放到相册上面, 相册地址为:http://photo.163.com/photos/good ...
- 孙鑫MFC笔记之十四--多线程同步与异步套接字编程
线程同步有三种方式: 1. 互斥对象涉及方法: HANDLE hMutex=CreateMutex(NULL,FALSE,NULL); //第二个参数为FALSE,将互斥对象声明为空闲状态 ...
- 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15] .
第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...
- 孙鑫VC++学习笔记(转载至程序员之家--虎非龙)[11--15]
第11课 1.创建4个菜单,为其添加消息响应,用成员变量保存绘画类型.添加LButtonDown和Up消息. 2.当窗口重绘时,如果想再显示原先画的数据,则需要保存数据.为此创建一个新类来记录绘画类型 ...
- 孙鑫mfc学习笔记第十四课
第十四课 网络的相关知识,网络程序的编写,Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过bind与驱动程序建立关系.此后,应用程序送给Socket的数据,由Sock ...
- 高等数学学习笔记——第二十六讲——导数在实际问题中的应用
1. 问题引入--导数的实际意义(因变量关于自变量的变化率) 2. 导数的应用--变化率求解示例1(跳水时瞬时速度的计算) 3. 导数的应用--变化率求解示例2(物体线密度的计算) 4. 导数的应用- ...
- OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc
OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...
- OpenCV学习笔记(十六):直方图均衡化:equalizeHist()
OpenCV学习笔记(十六):直方图均匀化:equalizeHist() 参考博客: 直方图均衡化的数学原理 直方图匹配的数学原理 直方图均衡化广泛应用于图像增强中: 直方图均衡化处理的"中 ...
- QT学习笔记(十六):setwindowflags的属性总结
QT学习笔记(十六):setwindowflags的属性总结 此枚举类型用于为小部件指定各种窗口系统属性.它们是不常用的,但在一些情况下是必要的.其中一些标志取决于底层窗口管理器是否支持它们. 主要类 ...
- MATLAB学习笔记(十六)
MATLAB学习笔记(十六) 一.常微分方程数值求解 1.1 常微分方程数值求解的一般概念 1.2 常微分方程数值求解函数 1.3 刚性问题 一.常微分方程数值求解 1.1 常微分方程数值求解的一般概 ...
最新文章
- AI语音算法“个性”强 与芯片端“磨合”挑战多
- spring boot 加载过程分析(三)
- mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理
- Python技术、爬虫、数据分析问题汇总【自用】
- 【VMCloud云平台】SCOM配置(额外篇)-应用可用性150点实时性测试
- 爬虫入门【10】Pyspider框架简介及安装说明
- 带标签的 break 和 continue (Java)
- Android CI with jenkins in ubuntu
- python的基础语法
- cad填充密度怎么调整_CAD填充实例教程,CAD2018怎么修改填充图案的比例方法
- osgb转json_基于CAD平台的OSGB数据分级渲染的方法与流程
- 使用SimHash进行海量文本去重
- 如何观看高清Youtube视频和高清视频的转帖方法
- STM8S003串口printf及帧判断
- 黄金分割法 ( 三分法 )
- CSS复合选择器、元素显示模式、背景
- 通过单片机定时器输出周期为1s的方波,驱动LED灯闪烁
- 高通量测序与杂交优势
- Making FIFA Coins with FUT 14 Winter Upgrades
- 目的:python 解决输出乱码问题形如\u63a5\u53e3\u8c03\u7528\u6210\u529f
热门文章
- 高清电视开播:大多用户仍难跨入
- 传富士康将在印度建世界最大代工厂
- linux 命令 — cut
- 转 PHP函数---$_Get()和$_Post()的用法
- NBU官方Doc網址https://www.veritas.com/support/en_US/article.DOC5332
- Java遇见HTML——JSP篇之JSP状态管理
- Mysql 分组聚合实现 over partition by 功能
- MySQL多IDC部署注意事项
- 主机动手系列 — 不同CPU,不同命令,怎么管理HP-UX服务器
- 1月3日 升 级gazebo7