服务器端Class 内容
Private Wsk(100) As New Winsock
Public Function aa1() As String
  Wsk(0).LocalPort = 9000
  Wsk(0).Listen
End Function
Private Sub Wsk_ConnectionRequest(index As Integer, ByVal requestID As Long)
  Wsk.Accept requestID
  Debug.Print Wsk.State
End Sub
客户端Class内容
Private Winsock1 As New Winsock
Private Sub Command1_Click()
  Winsock1.Connect "192.168.1.115", 9000
  Debug.Print Winsock1.State
End SubPrivate Sub Form_Load()
  Debug.Print Winsock1.State
End Sub为什么不能连接,Wsk_ConnectionRequest也无响应???

解决方案 »

  1.   


    你的服务器端的Winsock控件有没有初始化啊?
      

  2.   

    还要怎么初始化?
    我如果用窗体加载WINSOCK控件就可以。
      

  3.   

    在窗体加载时,下面的代码执行了吗?
    Wsk(0).LocalPort = 9000
      Wsk(0).Listen
      

  4.   

    Public Function aa1() As String
      Wsk(0).LocalPort = 9000
      Wsk(0).Listen
    End Function当然会有调用这个模块了,立即窗口里也显示出控件处于监听状态了。
      

  5.   

    Private Sub Wsk_ConnectionRequest(index As Integer, ByVal requestID As Long)
      wsk(0).close
      Wsk(0).Accept requestID
      Debug.Print Wsk.State
    End Sub
      

  6.   

    仍然一样,没有任何错误提示
    Private Sub Wsk_ConnectionRequest(index As Integer, ByVal requestID As Long)
      wsk(0).close
      Wsk.Accept requestID
      Debug.Print Wsk.State
    End Sub
    这段程序完全没被执行。
      

  7.   

    Dim Wsk(3) As New Winsock
    Private Sub Command1_Click()
      If Wsk(0).State <> 0 Then Wsk(0).Close
      Wsk(0).LocalPort = 9000
      'Wsk(0).Bind
      Wsk(0).Listen
      MainForm.Caption = "准备就绪"
      Debug.Print Wsk(0).State
    End SubPrivate Sub Command2_Click()
      MsgBox "控件状态为:" & Wsk(0).State
    End Sub
    Private Sub Wsk_ConnectionRequest(ByVal index As Integer, ByVal requestID As Long)
      MsgBox "有新的连接"
    End SubPrivate Sub Form_Load()
      'Dim Wsk(3) As New winsockEnd Sub在这段程序中,我如果用添加部件的方式把Winsock控件拖到窗体上就可以成功执行。如果用引用方式就不可以了。为什么ConnectionRequest不能被激活呢?
      

  8.   

    汗~~~~ 工程——引用——Winsock
    Dim wsk as new Winsock
    因为不希望有窗口出现。
      

  9.   

    不能这么做
    你可以 
    Dim withevents wsk as Winsock
    set wsk=new winsock
    但不能用数组
      

  10.   


    服务器端Class 内容
    Private Wsk(100) As New Winsock
    Public Function aa1() As String
      Wsk(0).LocalPort = 9000
      Wsk(0).Listen
    End Function
    Private Sub Wsk_ConnectionRequest(index As Integer, ByVal requestID As Long)
      Wsk.Accept requestID    '注意你这里,应该是Wsk(index).Accept requestID 
      Debug.Print Wsk.State
    End Sub
    客户端Class内容
    Private Winsock1 As New Winsock
    Private Sub Command1_Click()
      Winsock1.Connect "192.168.1.115", 9000
      Debug.Print Winsock1.State
    End SubPrivate Sub Form_Load()
      Debug.Print Winsock1.State
    End Sub为什么不能连接,Wsk_ConnectionRequest也无响应???
      

  11.   

    至zyg0(影子) :
    我也不知道啊,反复试过多次了。只要不用withevents定义ConnectionRequest就不能响应。用withevents后又不能使用数组!郁闷.......
      

  12.   

    //sckServer是个winsock控件,并将其index属性设0,即使用控件数组
    Private intMax As LongPrivate Sub Form_Load()
       intMax = 0
       sckServer(0).LocalPort = 9000
       sckServer(0).Listen
    End SubPrivate 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
          
       End If
    End Sub
      

  13.   

    我现在就是这样做的,因为想去掉窗体把网络部分单独做成无窗体的ActivexDll。
    IsObject() 函数用来判断Winsock控件是否加载不准确。每次都认为0~25都是已经Load了的,事实上我并没有Load它们,我现在是这样判断的。各位有没有更好的方法判断。
      On Error GoTo LoadSocket
      Dim i As Integer
      For i = 0 To MaxLinkers
        If Wsk(i).State = 0 Then
          Wsk(i).Listen
          Debug.Print i
          Exit For
        End If
      Next i
      Exit Function
    LoadSocket:
      Load Wsk(i)
      Wsk(i).LocalPort = LocalPort
      Wsk(i).Listen
      Debug.Print i
      

  14.   

    只需一个监听者就够了,不用每个都听。
    localport要设0
      

  15.   

    我自己有个例子是控件数组的,不是你这种直接的数组,但是好用,我没试过这种方法,我估计有可能是客户端的事,sock的连接是需要时间的,必须给他1段时间才能senddata 要不会出错,
    你不能直接连接就senddata
    最好在客户端的这个事件里写:
    Private Sub Winsock2_Connect()On Error GoTo errendWinsock2.SendData "ertwertwertw"
    Exit Sub
    errend:
    MsgBox "连接发生错误!数据发送失败!", vbOKOnly + vbExclamation, "TCP 错误信息"
    End Sub
    不触发服务器的连接事件也有可能是客户端的连接错误,就是我说的这个原因
      

  16.   

    在就是你的服务器连接事件,我在第一个帖子已经指出了
    Private Sub Wsk_ConnectionRequest(index As Integer, ByVal requestID As Long)
      wsk(0).close
      Wsk.Accept requestID‘错误在这里
      Debug.Print Wsk.State
    End Sub
    应该是:
    Private Sub Wsk_ConnectionRequest(index As Integer, ByVal requestID As Long)
      wsk(index).close
      Wsk(index).Accept requestID‘错误在这里
      Debug.Print Wsk(index).State
    End Sub
      

  17.   

    Class:
    Public Sub Class_Initialize()
      Wsk(0).LocalPort = 9000
      Wsk(0).Listen
    End SubPublic Function State(Index As Integer) As Long
      GetState = Wsk(Index).State
    End FunctionPublic Sub Wsk_ConnectionRequest(Index As Integer, ByVal requestID As Long)
      Wsk(Index).Close
      Wsk(Index).Accept requestID
      'wskconst
      Dim arrbyt() As Byte
      arrbyt = StrConv("连接成功", vbFromUnicode)
      Wsk(Index).SendData arrbyt
    End SubModuLe:
    Option Explicit
    Public Wsk(25) As New Winsock
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Dim cls As New Class1
    Private Sub Main()
      Msgbox cls.State(0)
      DoEvents
      Sleep 30000
    End Sub以上程序我在一个没有窗体的标准EXE中可以正常运行,能够接受客户端连接和数据。但是却无法执行这部分,也就是说客户端没有收到服务器端的回应。
      Dim arrbyt() As Byte
      arrbyt = StrConv("连接成功", vbFromUnicode)
      Wsk(Index).SendData arrbyt
    但是我如果加入一个窗体后就又无法响应ConnectionRequest事件了。
    我将其做成ActivexDll后无论如何调用
    Public Function State(Index As Integer) As Long
      GetState = Wsk(Index).State
    End Function
    过程返回值始终为0,客户端也无法连接上去。还有就是如果使用无窗体的工程,在执行完Sub Main 程序就结束了,除了载入一个窗体外有什么方法能让该程序挂在进程里响应winsock事件?
      

  18.   

    不通的原因找到了,我的DHCP服务器把我IP地址变了。
    但是那个程序只要加如了窗体就不行了! 我哭~~~  
    我把窗体的显示、有效全部设置无效了,只差没Unload了。
    而且我试过,有一旦Unload窗体程序就结束了。
    Private Sub Main()
      Dim i As Long
      MsgBox cls.GetState(0)
      DoEvents
      'For i = 0 To 100
      '  Sleep 100
      'Next i
      Form1.Caption = "no"
      Form1.Visible = False
      Form1.Enabled = False
    End Sub
      

  19.   

    影子,你的代码不是把Winsock放到窗体上的那种吧?
      

  20.   

    呵呵,谢谢,那种我就不要了,两年前我写过的,只是我想把服务器部分做成DLL而已。