C与C# socket 跨平台通讯传输结构体

最近需要写一个C组成的服务器端与C#的客户端进行交互的软件,刚开始写的时候发现C#端解析时候出现了故障,经过仔细研究后发现原因是发送方传输太快,出现了所谓粘包的现象。也就是在C#端的Receive()。这个函数返回的是多个结构体连起来的数据,这当然是无法解析的。我的解决方案如下:

 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#端解析成功。

转载于:https://www.cnblogs.com/matrixdogLOL/p/4453172.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值