服务器端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也无响应???
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也无响应???
你的服务器端的Winsock控件有没有初始化啊?
我如果用窗体加载WINSOCK控件就可以。
Wsk(0).LocalPort = 9000
Wsk(0).Listen
Wsk(0).LocalPort = 9000
Wsk(0).Listen
End Function当然会有调用这个模块了,立即窗口里也显示出控件处于监听状态了。
wsk(0).close
Wsk(0).Accept requestID
Debug.Print Wsk.State
End Sub
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 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不能被激活呢?
Dim wsk as new Winsock
因为不希望有窗口出现。
你可以
Dim withevents wsk as Winsock
set wsk=new winsock
但不能用数组
服务器端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也无响应???
我也不知道啊,反复试过多次了。只要不用withevents定义ConnectionRequest就不能响应。用withevents后又不能使用数组!郁闷.......
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
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
localport要设0
你不能直接连接就senddata
最好在客户端的这个事件里写:
Private Sub Winsock2_Connect()On Error GoTo errendWinsock2.SendData "ertwertwertw"
Exit Sub
errend:
MsgBox "连接发生错误!数据发送失败!", vbOKOnly + vbExclamation, "TCP 错误信息"
End Sub
不触发服务器的连接事件也有可能是客户端的连接错误,就是我说的这个原因
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
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事件?
但是那个程序只要加如了窗体就不行了! 我哭~~~
我把窗体的显示、有效全部设置无效了,只差没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