首先,大家都知道VB用Winsock控件做多客户程序的方法如下(目前我见过的只有这种,见识短浅,见笑了):
Private Sub Form_Load()
   Sock(0).LocalPort = 2000 '设置本机监听端口
   Sock(0).Listen           '将本端口设置为监听状态
End SubPrivate Sub Sock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
        SockIndex = GetSockIndex() '获得空闲的Winsock索引号,略...
        Load Sock(SockIndex)
        Sock(SockIndex).LocalPort = 0
        Sock(SockIndex).Accept requestID
    End If
    
End Sub
其次,应该很多人都知道DDOS攻击的原理,比如:发送SYN洪水包攻击,如果是用上面的方法做多客户程序,那就惨了。一般来说,发送SYN洪水攻击每秒钟少少也有几万个SYN包,即每个SYN包相当于向服务器提交一次连接申请,那么每一个包都会触发下面事件:Private Sub Sock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
        SockIndex = GetSockIndex() '获得空闲的Winsock索引号,略...
        Load Sock(SockIndex)
        Sock(SockIndex).LocalPort = 0
        Sock(SockIndex).Accept requestID
    End If
End Sub  
   
    试想想,每秒钟几万或者几十万次连接申请(即是SYN包),程序就每秒钟载入几万或者几十万个Sock(SockIndex),并且处于半连接等状态,太可怕了,黑客用单机就炸掉一台服务器了,还没发动僵尸大军呢各位高手有什么的解决办法呢?请多多指教啊!!!!!
(本人菜鸟分太少,问题又多多,暂时不给太多分了,留点分以后解决问题用,呵呵~~此帖作为讨论贴!)

解决方案 »

  1.   

    如果要处理,怎么在这ConnectionRequest过程里获得客户端的IP地地、数据包内容等信息呢?以便分析是不是正常的连接申请,是留下,否弃掉。
      

  2.   

    socket避免不了,可以配置防火墙来实现。
      

  3.   

    虽然有软/硬防火墙,加上软/硬防火墙并不一定能防住,所以,自己的程序总不能被动式的开着漏洞由软/硬防火墙来掌握命运吧,能分析到是否正常的连接起码不至于载入N多个无用又占资源多的Sock数组控件。
      

  4.   

    这儿倒有一个防DDOS的VC源码,我没仔细看,楼主看一下中不中:http://www.pudn.com/downloads87/sourcecode/windows/network/detail334028.html
      

  5.   

    LZ,需要认真复习一下,网络基本结构,你现在指出的winsock控件,只是应用层,如果像你所说的,那么不是在应用层实现的,最少最少,你至少先捕捉网卡封包,分析后,再决定是否放给应用层的应用程序处理!一般直接在硬件上面做出反应,是最佳的解决方案(至少目前是这样)
      

  6.   

    m60a1,你的回复确实近题,可以说是非常正确,看得出很有网络开发经验(而且是妹妹,真是不多见啊!~~)目前我也知道这个情况,如果时间允许的话,我会好好去学习网络基本结构(而不是复习),目前一起在网上搜索很多关于抓包,关于TCP协议原理,深入了解TCP三次握手中的各个包的结构,特别是第一个连接申请包SYN包!但是,问题在于VB很少实现抓包的程序,本人没见过,不知大家有没有方法实现抓包,这样可以对SYN包的分析。
      

  7.   

    面对DDOS确实没太多办法,结贴,确定实行B计划!