Socket编程模型概述

 Socket编程可以分为阻塞和非阻塞两种开发模式

阻塞模式是指在指定 Socket上调用函数执行操作时,在没有完成操作之前,函数不会立即返
回。例如,服务器程序在阻塞模式下调用 accepto函数等待来自客户端的连接请求时,将会阻塞
服务器线程,直至接收到一个来自客户端的连接请求。默认创建的 Socket为阻塞模式

  非阻塞模式是指在指定 Socket上调用函数执行操作时,无论操作是否完成,函数都会立即返
回。例如,在非阻塞模式下调用recv0函数接收来自客户端的数据时,程序会直接读取网络缓冲
区中的数据,无论是否读到数据,函数都会立即返回,而不会一直挂在此函数的调用上。


  下面通过一个形象的例子来说明阻塞模式和非阻塞模式的区别。假定有一些朋友要到家里来
做客,每个朋友都相当于是 Socket通信中一个来自客户端的请求。在阻塞模式中,主人(相当于
服务器程序)一直在门口等待朋友到来,接到朋友后将其送入客厅,然后再回到门口等待;在非
阻塞模式中,主人会定时到门口看看,如果有朋友来,就回到室内,并不在门口等待

  阻塞模式的 Socket通常用于通信量较少的简单网络应用程序,比如在第5章中使用的实例都
是采用阻塞模式的 Socket进行开发的;而非阻塞模式 Socket的并发处理能力强,可以同时建立多
个连接。在实际应用中,大多数网络应用程序采用非阻塞模式 Socket。


为了使服务器程序能够更快速地响应客户端提出的请求, Windows平台提供了5种 Socket
编程模型,即 Select模型、 WSAAsyncSelect模型、 WSAEventSelect模型重叠IO模型和完
成端口模型

1.Select模型
 

  Select模型又称为选择模型,它可以使 Windows Sockets应用程序同时对多个 Socket进行管理,调用 select(函数可以获取指定 Socket的状态,然后调用 Windows Sockets API实现数据发送和接收等操作。

  select()函数中使用集合来表示进行管理的多个 Socke。t默认情况下, Socket集合中包含64个元素,最多可以管理的 Socket数量为1024个。尽管 Select模型可以同时管理多个连接,但对集合的管理比较繁琐。而且每次在使用 Socket发送和接收数据之前,都需要调用 select函数判断Socket的状态,这会导致CPU额外的负担,从而影响应用程序的工作效率。

2. WSAAsyncSelect模型


  WSAAsyncSelect模型又称为异步选择模型,它为每个 Socket绑定一个消息。当 Socket上出
现事先设置事件时,操作系统会给应用程序发送个消息,从而使应用程序可以对该事件做相应
的处理。


  WSAAsyncSelect模型的优点是在系统开销不大的情况下可以同时处理许多个客户端连接
它的缺点是,即使应用程序不需要窗口,也至少设计一个窗口用于处理 Socket事件。而且,在
一个窗口中处理大量的事件也可能成为性能瓶颈。

3. WSAEventSelect模型


  WSAEventSelect模型又称为事件 Select模型,它允许在多个 Socket上接收以事件为基础的网
络事件通知。应用程序在创建 Socket后,调用 WSAEventSelectOI函数将事件对象与网络事件集合
相关联。当网络事件发生时,应用程序以事的形式接收网络事件通知

  WSAEventSelect模型与 WSAAsyncSelect模型之间的主要区别是网络事件发生时系统通知应
用程序的方式不同。 WSAAsyncSelect模型以消息的形式通知应用程序,而 WSAEventSelect模型
则以事件的形式进行通知。 Select模型会主动取指定 Socket的状态,而 WSAEventSelect模型和
WSAAsyncSelect模型则会被动选择系统通知应用程序 Socket的状态变化。
WSAEventSelect模型每次只能等待64个事件,这也是 WSAEventSelect模型的不足之处。

4.重叠I/O模型


  重叠O模型又称为 Overlapped I/O模型,它的基本设计原理是可以让应用程序使用重叠的
数据结构一次投递多个IO请求,当系统完成VO操作后通知应用程序。
 

  重叠O模型是真正意义上的异步I/O模型。在应用程序中调用输入输出函数后,程序将立
即返回。当1O操作完成后,系统会通知应用程序
 

  系统通知应用程序的形式有两种,即事件通和完成例程。事件通知方式即通过事件来通知
应用程序1O操作已完成,而完成例程则指定应用程序在完成O操作后调用一个事先定义的回
调函数

5.完成端口模型

  完成端口( Completion Port)是一种在 Windows服务平台上比较成熟和高效的I/O操作方法,
它使用线程池处理异步I/O请求。利用完成端口模型,应用程序可以管理成百上千个 Socket。

  可以把完成端口看成系统维护的一个队列,操作系统把重叠I/O操作完成的事件通知放
到该队列中,因此称其为“完成”端口。当 Socket被创建后,可以将其与一个完成端口联
系起来。

  一个应用程序可以创建多个工作线程用于处理完成端口上的通知事件。通常应该为每个CP
创建一个线程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值