Private Sub Winsock1_DataArrival(ByVal bytesTotal&)
Dim bData() As Byte
ReDim bData(bytesTotal - 1)
Call s_PrintToDebug(0, UBound(bData), bData)
End Sub
Private Sub Winsock2_DataArrival(ByVal bytesTotal&)
Dim bData() As Byte
ReDim bData(100)
Winsock2.GetData bData '这里不管是多少,都会自动变成合适的大小,就算上方写的100,也会变成真实大小。
Call s_PrintToDebug(0, UBound(bData), bData)
End Sub
Private Sub Winsock3_DataArrival(ByVal bytesTotal&)
End Sub
Private Sub Command1_Click()
Dim bData() As Byte
ReDim bData(100)
Winsock3.GetData bData
Call s_PrintToDebug(0, UBound(bData), bData)
End Sub
Public Sub s_PrintToDebug(lngArrByteStart&, lngArrByteEnd&, bData() As Byte)
Dim i&, strTemp$
For i = lngArrByteStart To lngArrByteEnd
strTemp = strTemp & " " & Right("0" & Hex(bData(i)), 2)
If (i + 1) Mod 16 = 0 Then strTemp = strTemp & vbCrLf
Next
Debug.Print strTemp
End Sub
以上3个过程,第1,2个可以打印出收到的16进制编码,第3个不能收到正确信息,会得到:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00
证明:.GetData必须在_DataArrival中才行,也就是否定了.GetData在外部通过Timer等方式定期清除Winsock缓存的方式。
另外经过测试:
Private Sub Winsock1_DataArrival(ByVal bytesTotal&)
End Sub
不使用Winsock1.GetData bData仍然不影响下次获得全新数据。
还有个测试:
? typename(Winsock1.RemoteHost)
String
? typename(Winsock1.RemotePort)
Long
这下知道它们的类型了吧。