求Socket服务端程序,防止攻击的解决方法与思路

求Socket服务端程序,防止攻击的解决办法与思路?
WSAAsyncSelect TCP 模式的数据包,按理说正常只有50-200以内的客户端连接数量。

加了心跳包检测(3分钟内如果客户端没响应,服务端将主动关闭连接)

客户端每40秒发送一个心跳包以示存活状态。

但是这个模式是基于消息处理的,假如被攻击的时候,有100客户端,每秒调用2个空的连接(只是connect,什么都不干)

这时候,就容易造成服务端主界面无响应,而其他正常的客户端反而连接不上(提示服务器主动关闭了连接)

如何防止这种大量空的connection造成的攻击?


难道一定要改成IOCP模式吗?

------解决方案--------------------
TCP模式需要心跳检测吗?LZ能告诉我吗?我是新手
------解决方案--------------------
基于消息处理不太合理吧
就算不是恶意攻击
当链接量大
并发高的时候不还是会假死么
------解决方案--------------------
这不就是网上流传的DDOS攻击吗
心跳还是需要的,要不然也不知道连接什么时候失效
如果担心大量攻击,可以这样,当connect之后,如果在规定的时间内,如果没有消息传过来(一般连接后先做一次握手)就断开这个链接,这样会减少一些无效的连接
------解决方案--------------------
tcp中如果呗syn洪水攻击了,现在是没什么办法的,就是那些门户网站想新浪什么的也很头疼这个问题
------解决方案--------------------
探讨

TCP模式需要心跳检测吗?LZ能告诉我吗?我是新手

------解决方案--------------------
TCP不需要心跳检测的,只要用recv判断返回值是不是-1就可以。

还有connect的这种攻击,可以通过协议来解决,

就是当你accept之后, 放入线程池当中立刻recv接收登陆命令,如果没接收到,那就是非法connect,立刻断开。

当然如果真的用心来攻击你,会模拟你的客户端登陆,这时候你要做限制,限制客户端在10内,或者多少50秒内只能同时登陆N次,这样服务器的并发就立刻降低下来了。也是现在服务器的主流设计。
------解决方案--------------------
探讨

TCP不需要心跳检测的,只要用recv判断返回值是不是-1就可以。

还有connect的这种攻击,可以通过协议来解决,

就是当你accept之后, 放入线程池当中立刻recv接收登陆命令,如果没接收到,那就是非法connect,立刻断开。

当然如果真的用心来攻击你,会模拟你的客户端登陆,这时候你要做限制,限制客户端在10内,或者多少50秒内只能同时登陆N次,这样服务器的并发就立……

------解决方案--------------------
首先可以通过套接字的底层配置解决部分问题:
1、AFD.SYS 保护参数设定
2、SYN攻击保护参数设定
这些都在MSDN上有专门的专题介绍

从用户程序的处理上来看
在连接建立后,应该立即rcv,超时就关闭,并且记录IP,对于恶意攻击的,可以实行封IP
如果应用协议是自己定的,可以加上几个字节的验证,一旦接受到不符合的,立即拉黑名单,封它几个小时