情况是这样的:程序用于控制前端的设备,网络为2M跨网段以太网。程序通过WinSock控件实现通讯,协议为Tcp/IP。前端使用的是其它厂家的以太网转换设备,该厂家提供可通过WinSock控件通讯的接口,设为Server端,程序为Client端,以下是抽取出的部分程序代码。
Private Sub Form_Load()
    Dim i as Integer
    For i=0 to 31
        TmrControlSta(i).Enabeld=True
    Next i
End SubPrivate Sub TmrControlSta_Timer(Index As Integer)
    '开始与前端的网络通讯,向前端发在线命令,同时测试在线状态。
    On Error GoTo Tmrexit
   
    If Me.WskClient(Index).State = sckConnected Then
        WskClient(Index).SendData DoorStaRequest         '向各前端发送在线检测
    Else
        If WskClient(Index).State <> sckConnected And _   
            WskClientIndex).State<>sckConnecting _
            And WskClient(Index).State <> sckClosing And _
            WskClient(Index).State <> sckOpen Then WskClient(Index).Connect
End If
Exit sub
Tmrexit:
End SubPrivate Sub TmrNetSta_Timer(Index As Integer)
    Dim i As Integer    '如果大于11S还没有前端状态信息返回则
If timeGetTime - TmLastGetTime(Index) > 11000 Then
Connected=False
          WskClient(Index).Close
    End If
End SubPrivate Sub WskClient_Connect(Index As Integer)
……
Connected=true
WskClient(Index).SendData DoorStaRequest          '发送获取门状态信息协议
……
End SubPrivate Sub WskClient_DataArrival(Index As Integer, ByVal bytesTotal As Long)
……
   TmLastGetTime(Index) = timeGetTime 
'开始检测是否超过11S还未有前端状态信息送回
If TmrNetSta(Index).Enabled = False Then TmrNetSta(Index).Enabled = True 
……
End SubPrivate Sub WskClient_Close(Index As Integer)
……
  Connected=False
……
End SubPrivate Sub WskClient_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
……
  If Number <> sckSuccess Then
Connected=False
WskClien(Index).Close
End If
……
End Sub

解决方案 »

  1.   

    共有32个前端,程序通过Winsock控件一一对应。但程序运行一段时间后就Connect就一直为False,即Winsock控件连接失败,只有重新启动程序才能连接上。程序中我通过TmrControlSta每隔2S就会向前端发送请求的啊。是不是不应该在Error事件中加上WskClien(Index).Close。还是什么原因呢?
      

  2.   

    还有程序每隔2S就会向前端获取数据,如果11S内未收到数据则认为网络断开,并主动断开WskClient(Index).Close.断开后,程序会一直判断是否需要重连接,见Sub TmrNetSta_Timer(Index As Integer)。
      

  3.   

    请各位高手指教,我对winsock不是很熟。