AcceptEx与WSAEventSelect和Accept
(转自论坛的一个帖子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的更多相关文章
- IOCP入门
完成端口(Completion Port)详解 此文讲解最好,也很全面一下其他文章看看就行,也可不看. 单句柄数据,单IO数据 此文讲述比较清晰,可以辅助理解上文. IOCP编程之基本原理:http: ...
- 完成端口(Completion Port)详解(转)
手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ...
- 完成端口(CompletionPort)详解
手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ...
- 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
手把手叫你玩转网络编程系列之三 完毕port(Completion Port)具体解释 ...
- 完成端口IOCP详解
修改自: http://blog.csdn.net/piggyxp/article/details/6922277 ps: 原作者很厉害了, 把一个iocp模型讲解的这么形象,不过在实践过程中发现一些 ...
- winSocket编程(十)完成端口
//本篇为转贴 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非 ...
- (转载)完成端口(Completion Port, I/OCP)详解
http://www.cnblogs.com/lancidie/archive/2011/12/19/2293773.html 手把手叫你玩转网络编程系列之三 完成端口(Completion P ...
- IOCP详解
http://blog.csdn.net/piggyxp/article/details/6922277 ps: 原作者很厉害了, 把一个iocp模型讲解的这么形象,不过在实践过程中发现一些细节说得有 ...
- 转:完成端口(Completion Port)详解
手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ...
随机推荐
- 学习java之利用泛型访问自己定义的类
如果有多个类,而且他们其中有一些方法是相同的,我是选择在每个类中都把这些方法实现一遍呢,还是选择泛型.我今天自己花了一点时间看了看泛型,实践了一下. Holder.java package regex ...
- Linux下tail命令
简述 tail命令从指定点开始将文件写到标准输出,使用tail命令的“-f”选项可以方便的查阅正在改变的日志文件,“tail -f filename”会把filename里最尾部的内容显示在屏幕上,并 ...
- ASP.NET静态页生成
由于业务需要,得把页面按照模板页生成静态页面,所以自己就琢磨了下,写些思路,以备日后需要的时候用. 静态页生成用到最多的就是匹配跟替换了,首先得读取模板页的html内容,然后进行你自己定义的标签匹配, ...
- Android 获取assets的绝对路径
第一种方法: String path = "file:///android_asset/文件名"; 第二种方法: InputStream abpath = get ...
- Go 语言做的几个验证码
1.http://www.oschina.net/code/snippet_173630_12006 : 效果: 源代码: 1: package main 2: 3: import ( 4: cra ...
- collect my database for test KCF tracker tools
Path Button used to set dir where avi file saves, set path set video size and start record write to ...
- FreeMarker笔记 第二章 数值和类型
2.1 基本内容 2.1.1 简介 2.1.2 什么是数值 和程序语言中的数值类型是相似的. 2.1.3 什么是类型? 2.1.4 数据模型是哈希表 2.2 类型 2.2.1 简介 2.2.2 标量 ...
- STL1-unordered_map
最近几天我要整理一下遇到的STL的函数,本来其实我是没有打算学的,认为用C就完全可以实现,干嘛要记那么多复杂的函数呢,所以我之前的做法都是将常用的C函数自己做了一个lib库,使用起来也是蛮方便的呢,但 ...
- Win10正式版激活方法有哪些?如何激活Win10?
很多用户都想将系统升级到Win10,但是却不知道怎么激活Win10正式版的方法,其实不同版本激活正式版Win10的方法秘钥不同,下面99安卓网小编就分享一些激活Win10正式版的方法和秘钥,供大家参考 ...
- layout相关
大致看了看布局大致有5种(approximately) 1. LinearLayout 2. RelativeLayout 3. FrameLayout 4. TableLayout 5. GridL ...