vb 用winsock识别二进制数据包

来源:百度知道 编辑:UC知道 时间:2024/06/02 00:41:06
我在做一个模拟XX的服务器,客户端发送各种二进制数据包,我如何识别它呢??
我想了一个方法,先用一个变量记录,再分成一个字节,最后再每一个字节去比较,这个又怎样呢??
下面是我研究很久的代码,但没有成功,这又出错再哪里,希望高手改一下

Private Sub ws1_DataArrival(ByVal bytesTotal As Long)
Dim Recv As Byte
Dim sData(2) As Byte
Dim sCommand(2) As Byte
On Error Resume Next

Ws1.GetData Recv, vbByte
' 分割为单字节
sData(0) = MidB(Recv, 1, 1)
sData(1) = MidB(Recv, 2, 1)
sData(2) = MidB(Recv, 3, 1)
'比较数据
'收到的数据为 FF 01 04
If sData(0) = CByte(255) And sData(1) = CByte(1) And sData(2) = CByte(4) Then
sCommand(0) = CByte(255)
sCommand(1) = CByte(1)
sCommand(2) = CByte(1)

Ws1.SendData sCommand()

End If

End Sub
我在问问里看过,但答案都是一塌胡涂,这个百度号也是别人的,我不敢给悬赏分,但希望有心帮我的各位VB高手能给我一个较好的答案~~~~~~~~~~~~~~
如果我再加多几个条件就实现不到了,应该怎样改啊??
我首先接收到FF 01 9B,然后接收到FF 01 04

你可以用Hex函数和UBound函数,然后对比原始数据。你的代码也可以,但是太麻烦。如果你是一个游戏私服。那么在DataArrival过程中要写多少代码呢?先用Hex一个一个的换成16进制。在用CStr换成string。逐个比较。

至于你的代码,我认为可能是MidB是截取string的吧。如果你去掉“on error。。。”就知道了。你用下面的代码试试:
Private Sub ws1_DataArrival(ByVal bytesTotal As Long)
Dim Recv() As Byte '注意,这个数组没有被定义大小! _
,如果WSock的GETDATA没有被获得任何信息,下面的For循环就会出错!
Dim sData(2) As Byte
Dim sCommand(2) As Byte
'On Error Resume Next

Ws1.GetData Recv(), vbByte
' 分割为单字节
For i = 0 To UBound(Recv())
sData(i) = Recv(i)
Next
'比较数据
'收到的数据为 FF 01 04
If sData(0) = CByte(255) And sData(1) = CByte(1) And sData(2) = CByte(4) Then
sCommand(0) = CByte(255)
sCommand(1) = CByte(1)
sCommand(2) = CByte(1)

Ws1.SendData sCommand()

End If

End Sub

如果我再加多几个条件就实现不到了,应该怎样改啊??
答复:

Private Sub ws1_DataArrival(ByVal bytesTotal As Long)
Dim Recv() As Byte
Dim sData As String