关闭

五种WinSock I/O模型的特点及比较

905人阅读 评论(0) 收藏 举报
======  select 模型:
         
        select模型是WinSock中应用最广泛的模型之一,核心就是select函数,它可用于
    判断套接字上是否存在数据,或者能否向一个套接字写入数据。
        这个函数可以有效地防止应用程序在套接字处于阻塞模式中时,send或recv进入
    阻塞状态;同时也可以防止产生大量的WSAEWOULDBLOCK错误
         select的优势是能够从当个线程的多个套接字上进行多重连接及I/O。
    这就避免了伴随阻塞套接字和多重连接的线程剧增

======  WSAAsyncSelect 模型:

        这个是我个人最喜欢的一个模型^_^  因为它也是以消息为基础的。
        关键就是WSAAsyncSelect函数,将socket消息发送到hWnd窗口上,然后在那里
    处理相应的FD_READ,FD_WRITE等等消息
    优点:
        WSAAsyncSelect和WSAEventSelect模型提供了读写数据能力的异步通知,但他们不
    提供异步数据传送,而重叠及完成大unkou提供异步数据的传送。
        而且它可以在系统开销不大的情况下同时处理很多连接,而select模型还需要建立
    fd_set结构。
        缺点:
        必须要使用一个窗口接收消息-_-b
        如果处理成千上万的套接字就力不从心了

======  WSAEventSelect 模型
        这个也是以时间为基础的网络事件通知,但是与WSAAsyncSelect不同的是,
    它主要是由事件对象句柄完成的,而不是通过窗口。
        这个就有点复杂了,一句半句说不清...-_-b
        优点:
          不需要窗口
        缺点:
          每次只能等待64个事件,所以处理多个套接字时有必要组织一个线程池;
          所以伸缩性就不如后面的完成端口了

======  重叠模型
        这个模型可以使程序能达到更加的系统性能。基本设计原理就是让应用程序
     使用重叠的数据结构,一次投递一个或多个I/O请求。针对这些提交的请求,
     在他们完成之后,应用程序可为他们提供服务。
        它又分为两种实现方法:在事件中使用,还有就是完成例程,每样都不是很好学-_-b

======  完成端口
        这个是所有里面最为复杂的I/O模型,楼主最好是在理解了重叠I/O的基础之
    上再来学习。
        完成端口提供了最好的伸缩性,往往可以使系统达到最好的性能,是处理
    成千上万的套接字的首选。
        从本质上说,完成端口模型要求创建一个windows完成端口对象,该对象通
   过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1778697次
    • 积分:24421
    • 等级:
    • 排名:第248名
    • 原创:709篇
    • 转载:8篇
    • 译文:1篇
    • 评论:353条
    博客专栏
    最新评论