我要写的是服务器端的程序
我有三个不同功能需要进行网络通讯,他们不能同时进行。这三个功能在不同的界面中。如果使不同界面分别使用一个winsock(即3个winsock),有如下疑问
如果是单个的就很好解决,Winsockserver1.Listen,Winsockserver1_ConnectionRequest,Winsockserver1_DataArrival 就好了
但是现在需要多个功能且不在一个界面完成,要怎么弄呢?
功能1完成后关闭Winsockserver1,Client也关闭了,要进行功能2client就必须再连一次。不断开Winsockserver1,功能2又连不上,
要怎么做可以是Client只连一次就完成三个功能呢?可以使用一个winsock控件来完成吗?

解决方案 »

  1.   

    使用winsock控件数组。论坛中有很多讨论的。
      

  2.   

    使用控件数组.
    option explicitprivate from_load() 
       dim i as integer
       for i = 1 to 1000
          load winsock1(i)
          winsock1.listen = true
          winsock1.xxxxx.
          ....
          ..
          .
       next i 
       msgbox "Done!"
       msgbox winsock1(500).status '(忘记是不是这个属性了,你用智能提示看看吧。)
    end sub
    前提你得在你的IDE环境下将 winsock1 的 index 属性调整为 0 然后就可以启用控件数组这样的方式来进行load了。。、
    如果你要在 程序中写在某个指定index的sock 来中断连接。你可以使用  unload winsock(iiiiiiii)  'iiii是指你要断开连接的sock 的index 属性.
      

  3.   

    当client 与winsock1(1)建立连接,且完成后。如何在不重拨的情况下与winsock1(2)接着建立连接通讯呢?
    使用unload winsock1(1)或 winsock1(1).close的话,client也关闭退出了
      

  4.   

    client的1和server的1连接,client的2和server的2连接
      

  5.   

    Client不是我写的,已经是成品
    那对于我来说就只有一个
      

  6.   

    服务器端用一个socket监听(该socket只负责监听)。当有连接请求时,用socket控件数组中没有工作(close状态)的一个socket与client建立连接,并接收或传送数据,任务完成之后,该socket关闭。
      

  7.   

    把Winsock1的ConnectionRequest事件发生时的requestID保存下来,然后在Winsock1不再需要与Client进行通讯时,执行:If Winsock2.State <> sckClosed Then Winsock2.Close
    Winsock2.Accept requestID    '这个requestID就是Winsock1的ConnectionRequest事件发生时的那个这样,Client就和Winsock2进行通讯了。不过,此时Winsock1不能Close,所以有可能带来编程上的其他问题。测试用的例程:Option ExplicitDim ArequestID As LongPrivate Sub Form_Load()
        'Winsock1进入侦听状态, Winsock2不需要进入侦听状态
        Winsock1.Bind
        Winsock1.Listen
    End SubPrivate Sub Command1_Click()
        '当Client与Winsock1连接成功之后,单击Command1,执行此段代码
        If Winsock2.State <> sckClosed Then Winsock2.Close
        Winsock2.Accept ArequestID
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
        If Winsock1.State <> sckClosed Then Winsock1.Close
        ArequestID = requestID
        Winsock1.Accept requestID
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        Dim s As String
        Winsock1.GetData s, vbString
        Debug.Print "From Winsock1 :" & s
    End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
        Dim s As String
        Winsock2.GetData s, vbString
        Debug.Print "From Winsock2 :" & s
    End Sub
      

  8.   


    你首先要知道,你的 Client 有没有 一对多的功能. 第二点. 客户端能不能与 Client 进行对话. 
      

  9.   

    但是winsock1和winsock2在不同的界面呢?
    通讯完成后,关闭form1的话winsock1被卸载了,通讯就退出了。这样还是要重新拨号啊
      

  10.   


    所以,建议只用一个Winsock与Client进行通讯,Winsock放在一个公用的Form中。
      

  11.   

    这样的话,dataarrival时我怎么知道是给谁的呢?
      

  12.   


    其实,如果你知道什么时候该Winsock2接收数据的话,自然也知道现在接收到的数据该给谁的。
      

  13.   

    看了你的需求。有点不明白。你不能留一个窗口不卸载吗?就用一个Winsock来完成三个你任务。如果客户端比较多的话,可以用数组控件来做。
    还有个问题,客户端和服务器是否在一个局域网内这也是个问题。如果不是还要考虑IP地址的问题。并且如果服务器端在一个装有防火墙的网内的话,问题还有很多的。