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

关键字: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

posted @ 2023-09-05 21:49  范哥范小飞  阅读(19)  评论(0编辑  收藏  举报