Excel VBA中sendto发送乱码问题排查(IPRAW/ICMP类型)
分析你的VBA IPRAW/ICMP数据包乱码问题
让我帮你拆解下这个问题——你说发送的三个'a'在Wireshark里显示乱码,但数据大小正确,核心问题大概率出在ICMP/IPRAW的协议格式要求和数据包结构的正确性上,咱们一步步理清楚:
1. 你忽略了ICMP协议的固定头部格式
ICMP不是直接发送纯原始字节的协议,它有严格的头部结构要求。你直接把三个'a'作为sendBuf发送,Wireshark会把这些字节当成ICMP协议的头部字段来解析,自然显示乱码——因为它期待的是符合ICMP规范的结构,而不是纯ASCII字符。
举个ICMP回显请求(Ping请求)的标准结构:
类型(1字节) + 代码(1字节) + 校验和(2字节) + 标识符(2字节) + 序列号(2字节) + 数据段
你现在只发送了3个字节,Wireshark会把第一个字节当成ICMP类型(正常回显请求是0x08),第二个当成代码(0x00),第三个当成校验和的低字节,这完全不符合协议规范,所以解析出来就是“乱码”,虽然总长度是3字节没错,但协议层面的解析逻辑完全跑偏了。
2. 确认IPRAW套接字的发送规则
如果用的是IPRAW类型的套接字,不同平台的要求不一样:
- 在Windows系统下,如果你设置了
IP_HDRINCL套接字选项,就必须自己构造完整的IP头部(包括版本、首部长度、TTL、协议等字段),否则发送的数据包结构不完整,Wireshark解析时会出错。 - 如果没设置这个选项,系统会自动帮你添加IP头部,你只需要发送ICMP的头部+数据部分即可,但即使这样,你也必须先构造合法的ICMP头部,再加上你的三个'a'数据。
3. 再核对VBA字节数组的构造逻辑
你说sendBuf的前三个字节确实是三个'a',这里要确认你是怎么把字符串转成字节数组的:
- 正确的ASCII转字节方式应该用
StrConv函数,避免Unicode编码问题:Dim sendBuf() As Byte ' 把字符串转成ASCII编码的字节数组,每个'a'对应1字节0x61 sendBuf = StrConv("aaa", vbFromUnicode) - 如果你直接用
sendBuf = "aaa",VBA默认会把字符串转成Unicode编码(每个字符占2字节),三个'a'会变成6字节(0x61 0x00 0x61 0x00 0x61 0x00),但你说Wireshark显示3字节,这部分你应该处理对了,但还是再确认下更稳妥。
解决建议
- 按照ICMP协议规范构造完整的数据包:
- 先构造ICMP头部(比如回显请求的类型设为0x08,代码0x00,计算正确的校验和,标识符和序列号可以随便设)
- 把你的三个'a'作为数据段追加到ICMP头部后面
- 计算ICMP校验和的方法:把整个ICMP数据包(头部+数据)按16位分组求和,取反得到校验和
- 检查IPRAW套接字的选项设置:如果是Windows平台,确认是否开启了
IP_HDRINCL,如果开启了,必须构造完整的IP头部;如果没开启,只需要发送合法的ICMP头部+数据即可 - 重新发送后再用Wireshark抓包,此时应该能正确识别ICMP数据包,你的三个'a'会显示在ICMP的数据段里
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

