最近用VB做通讯研究,在里面用到了一个WINSOCK控件,然后作了一个服务器端代码如下:
Private Sub Form_Load()
    wsServer.Listen
    txtOutput.Text = "服务器激活了!"
End SubPrivate Sub wsServer_ConnectionRequest(ByVal requestID As Long)
    If wsServer.State <> sckClosed Then
        wsServer.Close
    End If
    wsServer.Accept requestID
End SubPrivate Sub wsServer_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    wsServer.GetData strData
    txtOutput.Text = txtOutput.Text & vbCrLf & strData
End Sub随后做了个客户端,代码如下;Private Sub Form_Load()
    Winsock1.Connect "192.168.16.31", 5052
End SubPrivate Sub Text1_Change()
    Winsock1.SendData Text1.Text
    
End Sub
运行以后客户端成功发送消息给服务器端,但是一但关闭客户端以后,在运行就不能与服务器断连接通信了,换个IP的客户端还是不行。请问这是为什么,有什么解决办法没有!错误提示是所需事物的错误协议或连接状态,错误代码是40006。虚心求教中........

解决方案 »

  1.   

    在客户端的Form中Unload加Winsock1.Close
      

  2.   

    原因是,你的服务端 Winsock 已经不再侦听,进入了通讯状态。所以下一次客户端的连接请求无人应答,在没有建立连接的情况下 SendData 就会引起该错误。解决的方法:在服务端采用 Winsock 控件数组。
    Private Sub Form_Load(Byval Index As Integer)
        wsServer(0).Listen
        txtOutput.Text = "服务器激活了!"
    End SubPrivate Sub wsServer_ConnectionRequest(Byval Index As Integer, ByVal requestID As Long)
      If wsServer.Count > 1 Then
        If wsServer(1).State <> sckClosed Then
            wsServer(1).Close
            UnLoad wsServer(1)
        End If
      End If
      Load wsServer(1)
      wsServer(1).LocalPort = 0
      wsServer(1).Accept requestID
    End SubPrivate Sub wsServer_DataArrival(Byval Index As Integer, ByVal bytesTotal As Long)
        Dim strData As String
        If Index Then
          wsServer(Index).GetData strData
          txtOutput.Text = txtOutput.Text & vbCrLf & strData
        End If
    End Sub这样,服务端 Winsock 成员 0 始终用于侦听,1 用于通讯。