最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象。也就是在C#端的Receive()。这个函数返回的是多个结构体连起来的数据,这当然是无法解析的。我的解决方案如下:
class="brush:csharp;gutter:true;"> List<byte[]> listb = new List<byte[]>(); .......... int recv = newclient.Receive(b1); for (int x = 0; x < recv / 12; x++) { byte[] b2 = new byte[12]; int i=0; for (int lc = x * 12; lc < x * 12 + 12; lc++) { b2[i] = b1[lc]; i++; } listb.Add(b2); }
这样一来就直接解析listb中的元素就可以了,直接
foreach(var i in listb) { ................ }
但是在之后的解析之中还是出现了问题,我的结构体元素中后半部分的数字不是我发送端传送的,也不是乱码。后来再仔细检查发现,由于SERVER端是C写的,CLIENT是C#写的,两边是在不同的环境下。而C在声明结构体的时候,会有所谓“内存对齐”的现象发生。这样一来,在转换的地方会有中间一部分二进制是由编译器生成用来填充的数字。我的解决方案是在其中填充0字节(PS.终于知道为啥RIP啥的协议格式会如此诡异了)。填充完成后,结构体大小不变,C#端解析成功。