孙鑫vc学习笔记:第十六讲 用异步套接字编写聊天程序-尊龙官方平台

孙鑫vc学习笔记:第十六讲 用异步套接字编写聊天程序

el/2024/3/25 15:48:31

基于消息的异步套接字
 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.编写发送端程序
最后为按钮添加消息实现代码:
注意,
 此程序的接收端和发送端是在同一个线程下完成的,
 如果我们采用阻塞套接字会因为接收函数的调用而使主线程暂停运行。
 这样我们采用异步选择的机制完成了主线程的接收端和发送端,
 而不需要用多个线程,这个可以提高程序的性能。
 


http://www.ngui.cc/el/5126819.html

相关文章

孙鑫vc学习笔记:第十七讲 用剪贴板实现进程间的通信

孙鑫教学视频笔记(17)进程间通信 --------------------------------------------------------------------------------- 进程间通信的四种方式 剪贴板 匿名管道 命名管道 邮槽 --------------------------------------------------------------------------------- 剪贴…

孙鑫vc学习笔记:第十七讲 用匿名管道实现进程间的通信

用匿名管道实现进程间的通信: 匿名管道只能在本地主机上,父子进程之间完成通信: 步骤: 1.新建一个项目parent 2.增加“匿名管道”子菜单以及“创建管道”、“读取数据”与“写入数据”三个菜单项。 3.在cparentview 中添加两个…

孙鑫vc学习笔记:第十七讲 用命名管道实现进程间的通信

用命名管道实现进程间的通信: 命名管道概念: 命名管道是通过网络来完成进程间的通信,它屏蔽了地称的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。 命名管道充分利用了windows nt和windo…

孙鑫vc学习笔记:第十七讲 用邮槽实现进程间的通信

用邮槽实现进程间的通信: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。 邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据,为保证邮槽在各种windows平台下…

windows api函数大全 分类速查

1. api之网络函数 wnetaddconnection 创建同一个网络资源的永久性连接 wnetaddconnection2 创建同一个网络资源的连接 wnetaddconnection3 创建同一个网络资源的连接 wnetcancelconnection 结束一个网络连接 wnetcancelconnection2 结束一个网络连接 wne…

孙鑫vc学习笔记:第十讲画图 创建颜色/字体对话框

画图软件要经常改变当前画笔的颜色,创建一个颜色对话框让用户选择颜色是最方便的;我们也可以弹出一个字体对话框让用户方便地选择要显示的字体。这一节讲一下如何创建颜色对话框和字体对话框。

孙鑫vc学习笔记:第十讲画图 在窗口中贴上位图

要拷贝一张图片到窗口上,可以先用兼容的dc在内存中准备图像,再将图像拷贝到实际dc当中,步骤如下:1.创建位图2.创建兼容dc : cdc dccompatible; dccompatible.createcompatibledc(pdc);3.将位图选到兼容dc中4.将…

孙鑫vc学习笔记:第十讲画图 改变对话框及控件的文字/背景颜色

◆改变对话框及对话框上控件的背景颜色及文字颜色 1.增加wm_ctlcolor消息处理2.自定义一个画刷m_brush,让wm_ctlcolor消息处理函数onctlcolor返回, 对话框就会用这个画刷去绘制对话框和子控件 ◆如何改变一个button的颜色 要改变一个button的颜色&…

孙鑫vc学习笔记:第二十讲 hook编程

通过安装hook过程,可以用来屏蔽消息队列中某些消息 the setwindowshookex function installs an application-defined hook procedure into a hook chain. you would install a hook procedure to monitor the system for certain types of events. these events a…

孙鑫vc学习笔记:第二十讲 ado数据库编程

数据库编程: com [计] 小型可执行程序的扩展名, 串行通讯端口 [域] commercial organizations,商业组织,公司 the component object model组件对象模型 ado的三个核心对象 connection对象 connection对象表示了到数据库的连接,它管理应用程序和数据…
网站地图