首页 > 其他分享 >[原创]IOCP网络模型设置AcceptEx超时

[原创]IOCP网络模型设置AcceptEx超时

时间:2023-09-05 21:55:19浏览次数:38  
标签:socket AcceptEx IOCP iocp 超时 ioContext 客户端

关键字:IOCP防止恶意链接;iocp检测只连接不发送数据;iocp设置AcceptEx超时;iocp防止ddos

问题起因:(2008年的文章)https://bbs.csdn.net/topics/250032963

在写服务器程序,比较常见的一个问题是,当socket 连上来以后,它可能继没有数据发送也没有接受。
那么这个连接就会挂在那里。 假设这样的链接是恶意的, 那么他会大量消耗你的资源。

对于阻塞AcceptEx可以方便的设置超时,但是对于iocp,accept是非阻塞的。

经过本人测试,发现投递AcceptEx可以设置keepalive心跳包
if (false == fnAcceptEx(sockContext->connSocket, ioContext->ioSocket, ioContext->wsaBuf.buf, ACCEPT_RECV, sizeof(sockaddr_storage)/* + 16*/, sizeof(sockaddr_storage) /*+ 16*/, &dwBytes, &ioContext->overLapped)) { if (WSA_IO_PENDING != WSAGetLastError()) { return false; } }

参数说明:
该图片所在函数作用是PostAccept
sockContext->connSocket是监听socket,ioContext->ioSocket是保存客户端的socket
当监听socket接受到客户端connect后,会保存本地socket到ioContext。
其中第四个参数ACCEPT_RECV ,传入数字如果为0,则accpet后iocp就会返回,
这里我设置的是1,当客户端connect后 发送一个数据后才返回。

经过实测,发现监听socket可以设置tcp_keepalive,当客户端connect后没有发送数据,则会发送心跳包,通过检测心跳包判断是否恶意连接(比如ddos等)
如果客户端connect后没有发送数据超过设定的时间,iocp就会弹出超时的信号。主程序就可以关掉这个连接。

参考资料:https://blog.csdn.net/querw/article/details/6600327
https://www.cnblogs.com/stockcrm/articles/8846886.html
https://blog.csdn.net/chenlycly/article/details/121637018

标签:socket,AcceptEx,IOCP,iocp,超时,ioContext,客户端
From: https://www.cnblogs.com/coolfan/p/15962471.html

相关文章

  • 恒创科技:百|度抓取香港服务器抓取超时是什么情况?
    ​网络延迟导致抓取超时网络延迟是指从发送请求到接收响应之间的时间延迟。如果网络延迟过高,服务器可能无法及时响应请求,导致超时。在香港服务器上抓取数据时,如果网络延迟过高,可能会出现抓取超时的情况。服务器负载过高可能导致抓取超时当服务器同时处理大量请......
  • python+playwright 学习-79 设置全局导航超时和全局查找元素超时
    前言playwright默认全局的导航时间是30秒,查找元素超时也是30秒,有以下几个方法设置全局超时时间:browser_context.set_default_navigation_timeout()browser_context.set_default_timeout()page.set_default_navigation_timeout()page.set_default_timeout()导航超时设置......
  • 微服务15:微服务治理之超时
    ★微服务系列微服务1:微服务及其演进史微服务2:微服务全景架构微服务3:微服务拆分策略微服务4:服务注册与发现微服务5:服务注册与发现(实践篇)微服务6:通信之网关微服务7:通信之RPC微服务8:通信之RPC实践篇(附源码)微服务9:服务治理来保证高可用微服务10:系统服务熔断、限流微服务11......
  • 超时处理@Timeout注解
    importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importorg.junit.jupiter.api.Timeout;importstaticjava.lang.Thread.sleep;classTimeoutExampleTest{@Test@Timeout(7)voidtimeoutDemo1()throwsInterruptedExceptio......
  • 实现Fetch 请求扩展超时功能
    要实现基本的超时功能其实很简单,只需要使用AbortController这个API,如果你不熟悉它,可以点击链接了解一下/***@description:创建一个fetch函数*@param{*}timeout:传入超时的时间*@return{*}返回一个新的fetch函数*/functioncreateFetch(timeout){//......
  • 达梦数据库锁超时问题
    出现问题原因:还有其他用户在进行增删改操作,可以通过查看阻塞会话。可以通过查杀阻塞会话后再进行删除表的操作。查询语句SELECT*FROMV$SESSIONSWHERESQL_TEXTLIKE'%tablename%'杀掉阻塞语句:sp_close_session(140217151795752);再次执行之前的sql语句,就可以成功执行了......
  • c2工具sliver的python客户端无法修改grpc超时时间的解决办法
    业务需要,调用了很多implants来执行对应系统上的命令,但是无论怎么指定interactive.py中execute方法参数,命令执行超时时间总是30.后面通过扩展execute方法增加一个grpc超时参数后解决;具体方法如下:asyncdefexecute_ex(self,exe:str,args:List[str],output:bool,tim......
  • python+playwright 学习-71 expect 断言设置timeout 超时和自定义错误内容
    前言playwright提供了一个expect方法用于断言,还可以设置超时时间。expect使用断言描述expect(locator).to_be_checked()Checkboxischeckedexpect(locator).to_be_disabled()Elementisdisabledexpect(locator).to_be_editable()Elementisenabled......
  • Feign的超时时间如何设置,我研究了4种情况
    大家好,我是三友~~今天来聊一聊前段时间看到的一个面试题,也是在实际项目中需要考虑的一个问题,Feign的超时时间如何设置?Feign的超时时间设置方式并不固定,它取决于Feign在项目中是如何使用的,不同的使用方式,超时时间设置方式也不大相同,甚至还可能有坑。前置知识由于文章会涉及到F......
  • 问题--连接超时
    1.问题sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2003,"Can'tconnecttoMySQLserveron'113.54.246.60'(timedout)")(Backgroundonthiserrorat:https://sqlalche.me/e/20/e3q8)2.解决这个错误提示是SQLAlchemy和pymysq......