孙鑫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 常微分方程数值求解的一般概 ...
最新文章
- HDOJ 3966 Aragorn#39;s Story
- Python---根据字符串导入包(importlib)
- 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】
- fastjson 1.1.71.android 版本发布,优化部分场景性能
- [转]JS中判断鼠标按键判断
- 电子科大电气工程导师介绍绍_预告|卓越讲堂第二期——电气工程及其自动化专业介绍...
- PAT-1127. ZigZagging on a Tree (30)
- python语言中strike_Python学习笔记
- 字符串使用与内部实现原理
- 思岚科技受邀2018高交会 携多项“黑科技”亮相
- 随笔记录开发遇到的问题
- 赢在AI,人工智能技术体验
- ES(elasticsearch)备份还原脚本
- DL_C1_week4_2(build a deep neural network 2)
- 2.2.4 ES 6语法与ES 5语法
- java面试题(分布式篇)
- 统计代码放在网站php,网站添加简单访客统计代码
- Android:RecycleView基本使用(瀑布流)
- Matlab中的while循环
- kl-scroll-text (文字滚动)