You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节,这部分你应该处理对了,但还是再确认下更稳妥。

解决建议

  1. 按照ICMP协议规范构造完整的数据包:
    • 先构造ICMP头部(比如回显请求的类型设为0x08,代码0x00,计算正确的校验和,标识符和序列号可以随便设)
    • 把你的三个'a'作为数据段追加到ICMP头部后面
    • 计算ICMP校验和的方法:把整个ICMP数据包(头部+数据)按16位分组求和,取反得到校验和
  2. 检查IPRAW套接字的选项设置:如果是Windows平台,确认是否开启了IP_HDRINCL,如果开启了,必须构造完整的IP头部;如果没开启,只需要发送合法的ICMP头部+数据即可
  3. 重新发送后再用Wireshark抓包,此时应该能正确识别ICMP数据包,你的三个'a'会显示在ICMP的数据段里

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:21:16