Option Explicit
'定义常量
Const BUSY As Boolean = False
Const FREE As Boolean = True
'定义连接状态
Dim ConnectState() As Boolean
Dim RXD_Point As Integer
Dim ZxFlag As BooleanPrivate Sub Form_Load()
    ReDim Preserve ConnectState(0 To 1)
    On Error Resume Next
    ConnectState(0) = FREE
    ConnectState(1) = FREE
    '指定网络端口号
    Listener.LocalPort = 1000
    '‘开始侦听
    Listener.Listen
  Call SendMessage(RecList.hwnd, LB_SETHORIZONTALEXTENT, _
        8000, ByVal 0&)
         Call SendMessage(List1.hwnd, LB_SETHORIZONTALEXTENT, _
        8000, ByVal 0&)
End SubPrivate Sub Listener_ConnectionRequest(ByVal requestID As Long)
    Dim SockIndex As Integer
    Dim SockNum As Integer
    On Error Resume Next
   List1.AddItem "[ID=" & requestID & "]" & "请求连接,已接受!"
   
   
    '查找连接的用户数
    SockNum = UBound(ConnectState)
    If SockNum > 14 Then
     '   Form1.Print SockIndex & ""
        Exit Sub
    End If
    
    
    '查找空闲的sock
    SockIndex = FindFreeSocket()
    
    '如果已有的sock都忙,而且sock数不超过15个,动态添加sock
    If SockIndex > SockNum Then
          Load Sock(SockIndex)
    End If
    ConnectState(SockIndex) = BUSY
    Sock(SockIndex).Tag = SockIndex
     '接受请求
    Sock(SockIndex).Accept (requestID)
End Sub'客户断开,关闭相应的sock
Private Sub Sock_Close(Index As Integer)
    If Sock(Index).State <> sckClosed Then
        Sock(Index).Close
    End If
    ConnectState(Index) = FREE
    Form1.Print Index & "close"
End Sub'接收数据
Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim tubf() As Byte '接收的数据数组
    Dim Nowstr As String '暂存所有的接受数据
    Dim data_length As Integer '接收的数据字节数组下标长度
    Dim i As Integer
    Dim ii As Integer
    Dim temp As String '暂存提取的终端地址
    Dim getAdder As String '获取正常的终端地址
    
     '获取数据
    Sock(Index).GetData tubf, vbArray + vbByte
    '显示数据
    data_length = UBound(tubf)
     For i = 0 To UBound(tubf)
        Nowstr = Nowstr & Right("0" & Hex(tubf(i)), 2) & " "
    Next
    RecList.AddItem "[#" & Index & "]" & "发送 " & Nowstr
    Nowstr = ""
    '取地址:
     For ii = 1 To 3 '假设终端的地址是一个6位长度,例如:000001
        temp = temp + Right("0" & Hex(tubf(ii)), 2) '从报文中提取前几位设备的地址
     Next ii
     '把地址改成正常的阅读模式
        getAdder = Right(temp, 2) '
        temp = Left(temp, Len(temp) - 2)
        getAdder = getAdder + Right(temp, 2)
        temp = Left(temp, Len(temp) - 2)
        getAdder = getAdder + Right(temp, 2)
        
   '以下是判断地址是否在数据库中
   SQL = "select*from ceshi where Adder='" & getAdder & "'"
    Call CnOpen
    RsOpen (SQL)
    If Rs.EOF = True Then
        Exit Sub
    Else
        '判断是否是初始请求,是则显示在线
        If tubf(0) = &H68 And tubf(7) = &H68 And tubf(data_length) = &H16 Then
            Dim FunCode As String
            FunCode = tubf(8) ' = &HE
            If FunCode = &HE Then
            
                 List1.AddItem "[终端-" & getAdder & "]" & "在线"
       
             End If
              '回付连接确认帧
                     Dim sendbuf(7) As Byte
                     Dim TempStr As Byte
                     Dim Code As Long
                     sendbuf(0) = &H68
                        Code = Code + sendbuf(0)
                        TempStr = Val(Right(temp, 2))
                     sendbuf(1) = DEC_TO_BCD(TempStr)
                        Code = Code + sendbuf(1)
                        temp = Left(temp, Len(temp) - 2)
                        TempStr = Val(Right(temp, 2))
                     sendbuf(2) = DEC_TO_BCD(TempStr)
                        Code = Code + sendbuf(2)
                        TempStr = Val(Right(temp, 2))
                     sendbuf(3) = DEC_TO_BCD(TempStr)
                         Code = Code + sendbuf(3)
                     sendbuf(4) = &H68
                         Code = Code + sendbuf(4)
                     sendbuf(5) = &HE
                        Code = Code + sendbuf(5)
                     sendbuf(6) = Code Mod 256
                     sendbuf(7) = &H16
                Sock(Index).SendData sendbuf
                data_length = UBound(sendbuf)
                         For i = 0 To UBound(sendbuf)
                            Nowstr = Nowstr & Right("0" & Hex(sendbuf(i)), 2) & " "
                         Next
                 RecList.AddItem "[#" & Index & "]" & "发送 " & Nowstr
           
        End If
        ZxFlag = True
        Timer1.Enabled = True
    End If
     Rs.Close
     CN.Close
End Sub'寻找空闲的sock
Public Function FindFreeSocket()
    Dim SockCount, i As Integer
    SockCount = UBound(ConnectState)
    For i = 0 To SockCount
        If ConnectState(i) = FREE Then
            FindFreeSocket = i
            Exit Function
        End If
    Next i
    ReDim Preserve ConnectState(0 To SockCount + 1)
    FindFreeSocket = UBound(ConnectState)
End Function
Private Sub Timer1_Timer()
    Dim sendbuf(1) As Byte
    Dim Nowstr As String
    Dim data_length As Long
     sendbuf(0) = &H68
     sendbuf(1) = &H16
      Sock(Index).SendData sendbuf'''''''''就是这个地方的index不知道怎么填了,哪位能帮帮我????哪个客户端连接,就回哪个的信息
    data_length = UBound(sendbuf)
        For i = 0 To UBound(sendbuf)
           Nowstr = Nowstr & Right("0" & Hex(sendbuf(i)), 2) & " "
        Next
    RecList.AddItem "[#" & Index & "]" & "发送 " & Nowstr
End Sub