Option Explicit
Private MaxIndex As IntegerPrivate Sub Form_Load()
MaxIndex = 0
Winsock(0).Listen
End SubPrivate Sub Winsock_Close(Index As Integer)
Winsock(Index).Close
Unload Winsock(Index)
End SubPrivate Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
 If Index = 0 Then
    MaxIndex = MaxIndex + 1
    Load Winsock(MaxIndex)
    Winsock(MaxIndex).Accept requestID
 End If
End SubPrivate Sub Winsock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strMsg As String
Winsock(Index).GetData strMsg
MsgBox Index & MaxIndex
End Sub
这段代码能动态加载winsock控件,为什么不能动态卸载啊
msgbox 的值永远是+1的,高手帮忙改下啊当加载的winsock close的时候就卸载这个加载的winsock

解决方案 »

  1.   

    Winsock_Close事件中不能卸载它自己.有个折衷的办法,就是在这个事件里做两件事:一,将需要卸载的那个INDEX所指控件的TAG属性标记为"Unload".二,将一个卸载控件用定时器启动.这个定时器工作后,就开始对整个WINSOCK数组进行扫描,当发现有TAG属性为Unload的,就卸载它.这招在之前我写过的一个例子里有用到,请参考服务器端代码:http://www.m5home.com/blog/article.asp?id=169不知道大家有没有更好的办法.
      

  2.   

    WinSock 控件发生 Close 事件后,属性 State = sckClosed
    以后侦听到新的连接请求后可以重用该控件,也可以开一个定时器定期卸载状态为关闭的控件。
    MaxIndex 毫无意义,直接用 Winsock.UBound 就能取得。
      

  3.   

    并非在Winsock_Close事件中不能卸载它自己.在Winsock_DataArrival事件里判断有几个实例当然至少两个(0是监听用的、1是连接后传送数据用的),因为这触发这个事件,至少有一个连接存在。另外Winsock_Close事件是远程关闭连接时触发。试试以下代码:'form1 code
    Option Explicit
    Private MaxIndex As IntegerPrivate Sub Command1_Click()
       MsgBox Winsock.Count '在这判断有几个winsock实例。
    End SubPrivate Sub Form_Load()
    MaxIndex = 0
    Winsock(0).LocalPort = 1001
    Winsock(0).Listen
    Form2.Show
    End SubPrivate Sub Winsock_Close(Index As Integer)
    Winsock(Index).Close
    Unload Winsock(Index)
    End SubPrivate Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    If Index = 0 Then
        MaxIndex = MaxIndex + 1
        Load Winsock(MaxIndex)
        Winsock(MaxIndex).Accept requestID
    End If
    End SubPrivate Sub Winsock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strMsg As String
    Winsock(Index).GetData strMsg
    MsgBox Index & MaxIndex
    End Sub
    '----------------------------------------'form2 code
    Option ExplicitPrivate Sub Command1_Click() '点击进行连接,然后到form1看有几个winsock。
       Winsock1.RemoteHost = "127.0.0.1"
       Winsock1.RemotePort = 1001
       Winsock1.Connect
    '
    End SubPrivate Sub Command2_Click()
       Winsock1.SendData "gggggggggggg"
    End SubPrivate Sub Command3_Click()
        Winsock1.Close '在这关闭连接,再到form1里看有几个winsock
    End Sub