16.5 基于消息的异步套接字.txt

来自「网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节」· 文本 代码 · 共 21 行

TXT
21
字号
16.5  基于消息的异步套接字
Windows套接字在两种模式下执行νo操作:阻塞模式和非阻塞模式。在阻塞模式下,在νo操作完成前,
执行操作的Winsock函数会一直等待下去,不会立即返回(也就是不会将控制权交还给程序),例如,
程序中调用了 recvfrom函数后,如果这时网络上没有数据传送过来,该函数就会阻塞程序的执行,
从而导致调用线程暂停运行。上一章编写的网络聊天程序就工作在阻塞模式下,为了接收数据而单
独创建了一个线程,在该线程中调用 recvfrom函数接收数据,如果网络上没有数据传送过来,该函
数就会阻塞,从而导致所创建的那个线程暂停运行,但是并不会影响主线程的运行。而在非阻塞模
式下, Winsock函数无论如何都会立即返回,在该函数执行的操作完成之后,系统会采用某种方式
将操作结果通知给调用线程,后者根据通知信息可以判断该操作是正常完成了,还是出现错误了。
因为在很多情况下,阻塞方式会影响应用程序的性能,所以有时需要采用非阻塞方式实现网络应用
程序,有多种机制可以实现这种方式。Windows Sockets为了支持Windows消息驱动机制,使应用程
序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略。 Windows 
Sockets的异步选择函数WSAAsyncSelect提供了消息机制的网络事件选择,当使用它登记的网络事件
发生时, Windows应用程序相应的窗口函数将收到一个消息,消息中指示了发生的网络事件,以及
与该事件相关的一些信息。
因此,可以针对不同的网络事件进行登记,例如,如果登记一个网络读取事件,一旦有数据到来,
就会触发这个事件,操作系统就会通过一个消息来通知调用线程,后者就可以在相应的消息响应函
数中接收这个数据。因为是在该数据到来之后,操作系统发出的通知,所以这时肯定能够接收到数
据。采用异步套接宇能够有效地提高应用程序的性能。 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?