linux服务器开发中网络数据分析与故障排查( 六 )


所以 , 我们要么在发送方将数据转换成网络字节序(大端编码) , 要么在接收端再进行转换 。
下面看一下如果C++端传送一个如下数据结构 , Java端该如何解析(由于Java中是没有指针的 , 也无法操作内存地址 , 导致很多人无从下手) , 下面利用tcpdump来解决这个问题的思路 。
我们客户端发送的数据包:

linux服务器开发中网络数据分析与故障排查

文章插图
 
其结构体定义如下:
linux服务器开发中网络数据分析与故障排查

文章插图
 
利用tcpdump抓到的包如下:
linux服务器开发中网络数据分析与故障排查

文章插图
 
放大一点:
linux服务器开发中网络数据分析与故障排查

文章插图
 
我们白色标识出来就是我们收到的数据包 。这里我想说明两点:
  • 如果我们知道发送端发送的字节流 , 再比照接收端收到的字节流 , 我们就能检测数据包的完整性 , 或者利用这个来排查一些问题;
  • 对于Java程序只要按照这个顺序 , 先利用java.net.Socket的输出流java.io.DataOutputStream对象readByte、readInt32、readInt32、readBytes、readBytes方法依次读出一个char、int32、int32、16个字节的字节数组、63个字节数组即可 , 为了还原像int32这样的整形值 , 我们需要做一些小端编码向大端编码的转换 。




推荐阅读