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