(转自论坛的一个帖子http://bbs.csdn.net/topics/280032853)

AcceptEx主要用于向完成端口 投递一个或多个的连接请求。。当有连接时进来,这里分两种情况:
1.Accept 不接受数据,工作线程收到IO完成操作的通知。
2.Aceept 必须接收到客户端的部分数量,工作线程才会收到IO完成操作的通知。

我觉的AcceptEx完全可以被WSAEventSelect取代,只要我们注册了FD_Accept通知,那么当有连接进来时,就会产生消息,那么我
们就可以在消息处理时直接accept,代价只是多开一个Accept线程,WaitForSingleObject....每有一个连接,我们都可以捕
捉的到

相反,使用AcceptEx:
第一种情况,与WSAEventSelect没什么区别,每进一个连接,我们还要手动再投递Accept请求,以免Accept被耗尽

第二种情况:看似这个有点优势?但其实这个也是分二步进行的,一步是Aceept,另一步是接收数据。。
但当有连接进来,而不发送数据时,投递的AcceptEx永远不会返回,如果遇到攻击时,客户一直在连,但始终不发数据?后果是?
我们的程序挂掉了。。

解决这个问题的方法是使用一个线程,定时轮循Socket,判断时间是否超时,如超时则踢出。。

还有种方法是:

在创建监听套接字时创建一个事件,通过WSAEventSelect()这个API并注册FD_ACCEPT事件通知来把套接字和这个事件

关联起来。一旦系统收到一个连接请求,如果系统中没有AcceptEx()正在等待接受连接,那么上面的事件

将收到一个信号。通过这个事件,你就可以判断你有没有发出足够的AcceptEx(),或者检测出一个非正常

的客户请求。

这里提到这个还是要用到WSAEventSelect(),去动态调整AcceptEx 线程的数量

那为什么不一开始就用WSAEventSelect,每进一个连接就acceept呢?

莫非是事件通知速度慢?只一个线程进行accept并做相关处理在大量客户需要连接服务器时处理不过来?

AcceptEx除了接收连接外还能同时接收要求对方必须发送的第一个包(如果收不到这个包则不会接受对方的连接请求),这个特性可以用于防止DDOS攻击。

我觉得这点比较重要。

AcceptEx与WSAEventSelect和Accept的更多相关文章

  1. IOCP入门

    完成端口(Completion Port)详解 此文讲解最好,也很全面一下其他文章看看就行,也可不看. 单句柄数据,单IO数据 此文讲述比较清晰,可以辅助理解上文. IOCP编程之基本原理:http: ...

  2. 完成端口(Completion Port)详解(转)

    手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                           ...

  3. 完成端口(CompletionPort)详解

    手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                           ...

  4. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

       手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                    ...

  5. 完成端口IOCP详解

    修改自: http://blog.csdn.net/piggyxp/article/details/6922277 ps: 原作者很厉害了, 把一个iocp模型讲解的这么形象,不过在实践过程中发现一些 ...

  6. winSocket编程(十)完成端口

    //本篇为转贴 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非 ...

  7. (转载)完成端口(Completion Port, I/OCP)详解

    http://www.cnblogs.com/lancidie/archive/2011/12/19/2293773.html 手把手叫你玩转网络编程系列之三    完成端口(Completion P ...

  8. IOCP详解

    http://blog.csdn.net/piggyxp/article/details/6922277 ps: 原作者很厉害了, 把一个iocp模型讲解的这么形象,不过在实践过程中发现一些细节说得有 ...

  9. 转:完成端口(Completion Port)详解

    手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                           ...

随机推荐

  1. 以一个上传文件的例子来说 DistributedFileSystem

    public class UploadAndDown { public static void main(String[] args) { UploadAndDown uploadAndDown = ...

  2. erl0008 - unicode 和 utf-8之间的关系

    转载:http://blog.jobbole.com/84903/ 原文出处: 卢钧轶   欢迎分享原创到伯乐头条 本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧. 背景:字符集 ...

  3. phonegap 退出确认

    实现 再按一次退出  ,这里只针对 主active继承 DroidGap 或者CordovaActive 以下有2种 方案1: 重写CordovaWebView类 新建类NobackWebView p ...

  4. jquery事件学习笔记(转载)

    一.页面载入1.ready(fn)当DOM载入就绪可以查询及操纵时绑定一个要执行的函数.这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度. 简单地说,这个方法纯粹是对向wi ...

  5. 聊聊Dataguard的三种保护模式实验(上)

    Data Guard是Oracle高可用性HA的重要解决方案.针对不同的系统保护需求,DG提供了三种不同类型的保护模式(Protection Mode),分别为:最大保护(Maximum Protec ...

  6. slidingMenu默认显示菜单

    关键词:slidingmenu 默认 显示 打开 菜单 showMenu toggle 问题:要在Activity一打开就显示slidingmenu. 解决: 搜索“slidingmenu 默认打开” ...

  7. VB6.0编程笔记——(1)篇外篇&目录

    从计算机专业毕业到进入IT行业,说来也有些年头了.相比较而言算是幸运,也有很多的同学进入了其他行业,也有一些朋友又想进入这个行业.现在回想自己的一路历程,总结一下,也是一份记忆. 基于以上的原因,希望 ...

  8. selenium python (十一)alert/confirm/prompt的处理(js中的弹出框)

    webdriver中处理js所生成的alert.confirm以及prompt,采用switch_to_alert()方法定位到alert/confirm/prompt.然后使用text/accept ...

  9. 【转】linux下cpio命令使用

    转自:http://www.51testing.com/html/32/498132-816949.html 功能说明:备份文件. 补充说明:cpio是用来建立,还原备份档的工具程序,它可以加入,解开 ...

  10. JavaScript专业规则12条

    学习JavaScript是困难的.它发展的如此之快,以至于在任何一个特定的时刻,你都不清楚自己是否“做错了”.有些时候,感觉像是坏的部分超过了好的部分.然而,讨论这些并没有意义,JavaScript正 ...