问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VB中发送16进制数据包?

发布网友 发布时间:2022-05-12 22:37

我来回答

3个回答

热心网友 时间:2023-10-27 06:17

最好就是让对方发送一个反馈包然后发送下一个
或者定义一个数据包的结构,在包头存放标签,数据大小等
然后放数据
最后发包过去
(我自己做的加了MD5验证)

'这是接收数据的winsock
'Execute函数是处理数据的:Private Function Execute(ID As Integer, b() As Byte, ret As Boolean) As Byte()
'ret是是否返回发送一个数据包,b()是数据,ID是winsock的index(这是支持多sock的)

Private Sub wsi_DataArrival(Index As Integer, ByVal bytesTotal As Long)
'Debug.Print bytesTotal
'If bytesTotal = 2 Then Stop
'Debug.Print UBound(buff(bi).b)
If bytesTotal <= 0 Then Exit Sub
Dim bi As Integer, br As Long, kh As kHeader, kf As kFooter
bi = FindIDBuff(Index + 1)
If bi = -1 Then
bi = NewBuffindex
buff(bi).ID = Index + 1
Dim t() As Byte
ReDim t(LenB(kh) - 1) As Byte
wsi(Index).GetData t, , LenB(kh)

br = br + LenB(kh)
Debug.Print StrConv(t, vbUnicode)
CopyMemory kh, t(0), LenB(kh)
If IsKHValid(kh) Then
Debug.Print kh.Datalen
Debug.Print t(7)
'copymemory t(0)
buff(bi).Length = kh.Datalen
If kh.Datalen + br > bytesTotal Then
ReDim buff(bi).b(bytesTotal - br - 1) As Byte
'Debug.Print UBound(buff(bi).b)
wsi(Index).GetData buff(bi).b, , bytesTotal - br

br = bytesTotal
ElseIf kh.Datalen + br + LenB(kf) > bytesTotal Then
ReDim buff(bi).b(kh.Datalen - 1) As Byte
wsi(Index).GetData buff(bi).b, , kh.Datalen
br = br + kh.Datalen
ReDim buff(bi).b1(bytesTotal - br - 1) As Byte
wsi(Index).GetData buff(bi).b1, , bytesTotal - br
br = bytesTotal
Else
ReDim buff(bi).b(kh.Datalen - 1) As Byte
wsi(Index).GetData buff(bi).b, , kh.Datalen
ReDim t(LenB(kf) - 1) As Byte
wsi(Index).GetData t, , LenB(kf)
CopyMemory kf, t(0), LenB(kf)
Dim r As Boolean, rb() As Byte
If IsKFValid(kf, buff(bi).b) Then
rb = Execute(CInt(kh.ID), buff(bi).b, r)
buff(bi).ID = 0
If r = True Then wsi(Index).SendData rb
End If
End If
Else
'invalid= =
buff(bi).ID = 0
Call wsi_DataArrival(Index, bytesTotal - br)
End If
Else
'there is buff
If buff(bi).Length > UBound(buff(bi).b) + 1 Then 'loading buff0
If buff(bi).Length - UBound(buff(bi).b) - 1 >= bytesTotal Then
Dim t_ub As Long, t_b() As Byte
t_ub = UBound(buff(bi).b)
ReDim Preserve buff(bi).b(UBound(buff(bi).b) + bytesTotal) As Byte
ReDim t_b(bytesTotal - 1) As Byte
wsi(Index).GetData t_b, , bytesTotal
br = bytesTotal
Debug.Print UBound(t_b)
CopyMemory buff(bi).b(t_ub + 1), t_b(0), bytesTotal
Else
t_ub = UBound(buff(bi).b)
ReDim Preserve buff(bi).b(buff(bi).Length - 1) As Byte
ReDim t_b(buff(bi).Length - t_ub - 2) As Byte
Debug.Print UBound(t_b)
wsi(Index).GetData t_b, , buff(bi).Length - t_ub - 1
br = UBound(t_b) + 1
CopyMemory buff(bi).b(t_ub + 1), t_b(0), buff(bi).Length - t_ub - 1
If bytesTotal - br >= LenB(kf) Then
ReDim t(LenB(kf) - 1) As Byte
wsi(Index).GetData t, , LenB(kf)
br = br + LenB(kf)
CopyMemory kf, t(0), LenB(kf)
If IsKFValid(kf, buff(bi).b) Then
rb = Execute(CInt(kh.ID), buff(bi).b, r)
buff(bi).ID = 0
If r = True Then wsi(Index).SendData rb
End If
If bytesTotal - br > 0 Then Call wsi_DataArrival(Index, bytesTotal - br)
Else
ReDim buff(bi).b1(bytesTotal - br - 1) As Byte
wsi(Index).GetData buff(bi).b1, , bytesTotal - br
br = bytesTotal
End If
End If
Else 'loading buff1
Dim tch As Long
tch = -1
On Error Resume Next
tch = UBound(buff(bi).b1)

If LenB(kf) - tch - 1 >= bytesTotal Then
t_ub = tch
ReDim buff(bi).b1(LenB(kf) - 1) As Byte
wsi(Index).GetData buff(bi).b1(t_ub + 1), , LenB(kf) - t_ub - 1
Else
t_ub = tch
ReDim buff(bi).b1(tch + bytesTotal) As Byte
wsi(Index).GetData buff(bi).b1(t_ub + 1), , bytesTotal
End If
End If
End If
End Sub

''''''
'一个模块
option explicit
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Type Buffer
b() As Byte
b1() As Byte
ID As Integer
Length As Long
End Type

Public buff() As Buffer

Public Const ver1 As Byte = 1'版本..可能以后会用到
Public Const ver2 As Byte = 0
Public Const signa As Long = &H4B501111 '数据包的标记,可根据需要修改
Public Type kHeader
start As Byte
version(1) As Byte
sign As Long
ID As Long
Datalen As Long
End Type

Public Type kFooter
MD5(15) As Byte
sign As Long
end As Byte
End Type

Public Declare Sub MD5Final Lib "advapi32" (ctx As MD5CONTEXT)
Public Declare Sub MD5Init Lib "advapi32" (ctx As MD5CONTEXT)
Public Declare Sub MD5Update Lib "advapi32" (ctx As MD5CONTEXT, buf As Any, ByVal Length As Long)
Public Type MD5CONTEXT
i(1) As Long
buf(3) As Long
inp(63) As Byte
digest(15) As Byte
End Type
Public Const MM_JOIN As Byte = &H10
Public Const MMRET_JOIN As Byte = &HE0
Public Const MM_JOINREQINFO As Byte = MM_JOIN + &H1
Public Const MMRET_JOINREQINFO As Byte = MMRET_JOIN + &H1
Public Const MM_ECHO = &HFF

Public Function MD5Hash(b() As Byte) As Byte()
Dim m5c As MD5CONTEXT
MD5Init m5c
MD5Update m5c, b(0), UBound(b) + 1
MD5Final m5c
MD5Hash = m5c.digest
End Function

Public Function PackUp(ID As Integer, b() As Byte) As Byte()
Dim p() As Byte, K As kHeader, kf As kFooter
ReDim p(UBound(b) + LenB(K) + LenB(kf)) As Byte
K.start = &H2
K.version(0) = ver1
K.version(1) = ver2
K.sign = signa
K.ID = ID
K.Datalen = UBound(b) + 1
CopyMemory p(0), K, LenB(K)
CopyMemory p(LenB(K)), b(0), UBound(b) + 1
Dim tb() As Byte
tb = MD5Hash(b)
CopyMemory kf.MD5(0), tb(0), 16
kf.sign = signa
kf.end = &H3
CopyMemory p(UBound(p) - LenB(kf) + 1), kf, LenB(kf)
PackUp = p
End Function

Public Function RawJoinReqInfo(ByVal ID As Integer) As Byte()
Dim p(2) As Byte
p(0) = MM_JOINREQINFO
CopyMemory p(1), ID, 2
RawJoinReqInfo = p
End Function

Public Function IsKHValid(K As kHeader) As Boolean
If K.start = &H2 And K.sign = signa Then
IsKHValid = True
End If
End Function

Public Function IsKFValid(K As kFooter, b() As Byte) As Boolean
Debug.Print b(1)
If K.end = &H3 And K.sign = signa And bequal(K.MD5, MD5Hash(b)) Then
IsKFValid = True
End If
End Function

Private Function bequal(b1() As Byte, b2() As Byte) As Boolean
Dim i& ', cmin&
'cmin = Abs(UBound(b1) + UBound(b2)) - Abs(UBound(b1) - UBound(b2)) / 2
Debug.Print b1
If UBound(b1) - LBound(b1) <> UBound(b2) - LBound(b2) Then Exit Function
For i = 0 To UBound(b1)
If b1(LBound(b1) + i) <> b2(LBound(b2) + i) Then Exit Function
Next i
bequal = True
End Function

热心网友 时间:2023-10-27 06:17

发送的数据包格式取决于接收端的处理函数接口。

字串格式:直接用字符串发送;
二进制数据:使用字节数组,定义为 Dim abytSend() As Byte,每一个数组元素保存一个字节的十六进制代码(0-255)。

每发一个包,通过sleep函数进行延时处理,或者等于接收端反馈后再发下一个包,或者在两个包之间加上特征字串来分隔。这个根据数据内容和发送要求自己决定吧。

热心网友 时间:2023-10-27 06:18

发送16进制数据包跟发送String类型的数据包是一样的。
或者你也可以转换成2进制发送。

主要是接收端对数据包的处理。

winsock1.sendata "abcde"
Doevents '这里加一句
winsock1.sendata "fghij"
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
黑鱼身上有寄生虫吗 寄生虫是否可能存在于鱼的身体里? 取保候审没拘留怎么办 支付宝开通快捷支付后,能在支付宝查银行卡余额吗? 秋天,正是吃板栗的季节,分享7种经典吃法别错过,老少皆宜! CHOW TAI SENG 周大生 P0PC0078 桃花Pt950铂金项链 购买最佳价格 周大生的钻戒PT950 0.27ct I-J VS 7892元贵吗? 周大生铂950项链J1909011916 重量:4.69g 和Pt950吊坠J191000191967 重量... CHOW TAI SENG/周大生 P0PC0078 桃花Pt950铂金项链 45cm 3.63g-详细介... 白金多少钱一克PT950 #运营总监#运营总监具备什么样的技能能够突出 “Welcome!”信息的UTF-8编码十六进制值是什么,这些值在网络中以TCP方式是如何传输的? 油炒饭怎么炒好吃? delphi7 idTcpServer 怎么以十六进制模式发送中英文混合的字符串(对方只能接收十六进制的数据)?在线急 已知tcp头部用十六进制数表示为 16进制通讯指令tcp如何发送 中国历史上最后一位皇帝是谁? 中国最后一个皇帝是? 中国历史上最后一位皇帝到底是谁? 中国历史最后一位皇帝是谁 中国历史上最后一位皇帝是谁 中国最后一个皇帝是谁? 中国的最后一个皇帝是谁? 银行贷款没有还,还能分期付款买房吗? 中国的最后一位皇帝是谁 重庆小学校长愿意聘用残障女硕士,聘用后她是否能享受正常聘用教师的待遇? 垫江县启音残疾人康复服务中心教师是有编制吗? 女硕士因残疾未通过教师资格认定,你对此有何看法? 女硕士因残疾未通过教师资格认定,这么做合理吗? 教师特岗不允许残疾人进入吗 醤油炒饭怎么做? 如何通过jmeter 发送tcp请求 计算机网络 已知TCP头部用十六进制数表示为:05320017 00000001 00000055 500207FF 00000000。 TCP/IP十六进制的数据分析的出来吗 labview平台下TCP接受网口调试助手发送的十六进制内容 新媒体运营最高能做到什么程度 VB.NET 如何通过TCP/IP协议通讯实现16进制数据的接收? 在VB中建立了 TCP服务器,客户端发送过来一组 20位的数据 按十六进制显示为: .已知TCP头部用十六进制数表示为05320017 000000001 00000000 500207FF 00000000,则其目的端口号为 猪油渣炒饭怎么做好 关于注册规划师。 橄榄油蛋炒饭怎么做 家常饭--酱油炒饭怎么做?最好是即做法简单又味道好吃! 注册规划师最近三年多少?一年多少? 安行保B款BMI投保范围 北大方正人寿安行保两全保险B款怎么样? 求驾校广告语 家常手工剁椒的腌制方法 电脑横机是属于专用设备还是通用设备呢 如何进行城市规划?