程序中有两个winsock控件,一个叫sock.另一个叫listener负责监听有无新客户连接。
有的话。则load sock(i).
-----------------------------------------------
Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
Dim SockIndex As Integer
Dim SockNum As Integer
On Error Resume Next
Text1.Text = requestID & "连接请求"
SockNum = UBound(ConnectState)
If SockNum > 50 Then
Exit Sub
End If
SockIndex = FindFreeSocket()
If SockIndex > SockNum Then
Load sock(SockIndex)
End If
ConnectState(SockIndex) = BUSY
sock(SockIndex).Tag = SockIndex
sock(SockIndex).Accept (requestID)
Text1.Text = SockIndex & "接受请求"
End Sub
另本人很不解的问题是:
如果有两个客户端连接服务器。则服务器程序会自动载入两个winsock控件。
那么客户程序和服务器程序之间的通信是怎样进行的呢?
服务器端的sock(1)和客户端的client进行通信
服务器端的sock(2)和客户端的client进行通信
那么服务器端怎样读取sock(1)和client通信内容呢?
服么服务器端怎样读取sock(2)和client通信内容呢?
--------------------------------------------
Private Sub Listener_DataArrival(ByVal bytesTotal As Long)
Dim dx As Double
Text1.Text = "数据来自" & Index
sock(Index).GetData dx, vbDouble
Text1.Text = "dx=" & dx
End Sub这样可以读取吗?
listen可是用来监听有无新连接的控件啊。它能得到sock(1)和client通信内容吗?
如果能。请给予解释。如果不能。请给出解决办法。
希望大家踊跃参与!

解决方案 »

  1.   

    应该在sock的dataarrival中收到,他里面有一个index说明是哪个winsock
    Private Sub sock_DataArrival(index as integer,ByVal bytesTotal As Long)
    Dim dx As Double
    Text1.Text = "数据来自" & Index
    sock(Index).GetData dx, vbDouble
    Text1.Text = "dx=" & dx
    End Sub
      

  2.   

    用动态数组法:
    见例子:
        Private Sub sckServer_ConnectionRequest _ 
        (Index As Integer, ByVal requestID As Long) 
         If Index = 0 Then 
         intMax = intMax + 1 
         Load sckServer(intMax) 
         sckServer(intMax).LocalPort = 0 
         sckServer(intMax).Accept requestID 
         Load txtData(intMax) 
         End If 
        End Sub
      

  3.   

    Private Sub Listener_DataArrival(ByVal bytesTotal As Long)
    Dim dx As Double
    Text1.Text = "数据来自" & Index
    sock(Index).GetData dx, vbDouble
    Text1.Text = "dx=" & dx
    End Sub
    是不行的,应该用sock的dataarrival事件
      

  4.   

    用动态数组
    1、scksrv(0).listen
    2、scksrv_connectionrequest(index...
       if index=0 then
           load scksrv(Idleindex)
        end if
    3、scksrv_DataArrival(index,ByVal bytesTotal As Long)
    scksrv(index).getdata Vdata
    ...
      

  5.   

    见例子:
    Private Sub WinsockServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim s As String
        Dim i As Integer
        WinsockServer(Index).GetData s
        If UCase(Left(Trim(s), 2)) = "PT" Then '判断是否为悄悄话,点对点方式
            If IsNumeric(Mid(Trim(s), 3, 1)) Then
                i = Mid(Trim(s), 3, 1)
                WinsockServer(i).SendData "Channel " & Index & " " & Right(Trim(s), Len(Trim(s)) - 3)
                DoEvents
            End If
        Else '广播方式
            For i = 0 To MaxChan - 1
                '利用winsock的State属性给所有连接在服务器上的客户发消息
                If WinsockServer(i).State = 7 Then
                    WinsockServer(i).SendData "Channel " & Index & " " & Trim(s)
                    DoEvents
                End If
            Next i
        End If
        ListShow.AddItem "channel" & Index & ":" & Trim(s)
    End Sub
      

  6.   

    很明显一对多是要用WINSOCK数组的,但关键在于怎样增加INDEX。最好不要放在数组里如果来一个加一个很容易溢出的,可以存在 数据库里。每LOAD一个就从数据库里查一次,把下线的没用的付给它。没有空的就加1。
      

  7.   

    dim一个布尔动态数组...按着winsock的index分配它的大小.那一个winsock加载了,相应的在这个数组里设置index维的值为true!
    添加一个时间控件,检查winsock的state属性.如果是同级关闭,错误,关闭等状态时,把它unload了,再相应的设置布尔数组index维的值为false!
    然后在winsock的connectionrequest事件里,搜索布尔数组那一维被设成false了,如果没有,就把布尔数组用redim preserve扩大一下,load winsock(ubound(布尔))
    这里还有一个第一次连接的问题,楼主看着办了!