AcceptEx与WSAEventSelect和Accept - 冰花ぃ雪魄

zhaoxinshanwei 2021-08-29 原文


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攻击。   

我觉得这点比较重要。

 

posted on
2014-08-03 09:48 
冰花ぃ雪魄 
阅读(300
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zhaoxinshanwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhaoxinshanwei/p/3888077.html

AcceptEx与WSAEventSelect和Accept - 冰花ぃ雪魄的更多相关文章

随机推荐

  1. 网易云免费OSS服务用做Markdown图床或博客图片外链

    我使用据说是Windows下最好用的Markdown编辑器“MarkdownPad2”(个人感觉还是Visua […]...

  2. 百度全景地图使用时提示flash版本过低 如何处理?

      从Chrome 69.0 版本起,Flash权限受到进一步限制,默认仅在当前浏览器会话有效。关闭Enabl […]...

  3. 5分钟教你在Linux下安装VMware

    如果我们只有一台笔记本,又想要搭建一个小集群,怎么办?虚拟机帮你实现梦想,市面上较为常用的虚拟机软件有VMwa […]...

  4. Lottie在手,动画我有:ios/Android/Web三端复杂帧动画解决方案

    Lottie是一个用于Web和iOS(Android)的移动库,用于解析使用Bodymovin导出为json的 […]...

  5. 什么是中介者模式

    1 定义 中介者模式是一种行为设计模式,让程序组件通过特殊的中介者对象进行间接沟通, 达到减少组件之间依赖关系 […]...

  6. 反射2–Field,简单的实现和部分源码分析

    >部分思路来自互联网 ### 反射2–Field “` public class […]...

  7. JAVA-检测jdk环境变量是否安装成功&配置jdk环境变量

    一、检测jdk环境变量是否安装成功 1.win+R,输入cmd 2.输入javac.exe 出现如下界面 3. […]...

  8. java刷题时常用容器详解

    当初学java时,只是简单的把java基础知识过了一遍就跑去刷题了,很多知识都是在刷题的过程中慢慢加深理解的。 […]...

展开目录

目录导航