c#socket接收三组数据合并问题,求助

裂骨 2019-08-06 09:12:37
利用socket接收plc发送的多次,每次三组byte【240】数据复制合并为一个byte【720】的数据,
处理显示在textbox中,但是只有第一组【240】的数据可以正常显示,第二组的数据会 正常数据 和 0 交替闪烁,
求助解决方式,感谢。

byte[] myReceByte = new byte[240]; //分别存放接收的三次数据
byte[] myReceByte2 = new byte[240];
byte[] myReceByte3 = new byte[240];
byte[] myReceByte4 = new byte[720]; //三组数据复制到myReceByte4,进行处理

int recv = clientSock.Receive(myReceByte); //数组1长度
Array.Copy(myReceByte, 0, myReceByte4, 0, recv); //复制1到4中

int recv2 = clientSock.Receive(myReceByte2); //再次接收一组数组2
Array.Copy(myReceByte2, 0, myReceByte4, recv, recv2); //复制2到4中

int recv3 = clientSock.Receive(myReceByte3); //数组3
Array.Copy(myReceByte3, 0, myReceByte4, recv2, recv3); //复制到4



if (myReceByte4.Count() == 720)
{
try
{
SplitPackage(myReceByte4); //对数组4进行处理,想将数据解析,显示在textbox
DisplayStatusMsg("接收成功!");



}
catch (Exception ec)
{
DisplayStatusMsg("接收失败!" + ec.Message);
...全文
293 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBodhi. 2019-08-07
  • 打赏
  • 举报
回复
增加 数据标识,例如长度,编号,等等,防止粘包,
datafansbj 2019-08-07
  • 打赏
  • 举报
回复
楼主应先了解 TCP 粘包、分包问题。也怪微软,MSDN 上关于 TCP Socket 的例子,从来就没有考虑过这个问题,新手多会在这里栽跟头。 int recv = clientSock.Receive(myReceByte); 这行代码确定能收到全部 240 字节的数据吗?不是,只能收到 recv 个字节,recv <= 240。如果网络质量不好,可能会被拆分成若干个包,你需要多次 Receve,直到收全。
m0_37646670 2019-08-07
  • 打赏
  • 举报
回复
引用 3 楼 Medly 的回复:
[quote=引用 2 楼 wanghui0380 的回复:] 哎,又是这个。 没有1,2,3,4这种。,解释不了,打比方把 4个人包饺子,一个山东人擀皮,3个湖北人包。山东人擀皮飞快,他一个人擀皮,3个湖北的包都还有富裕的。后来换过来,3个湖北人擀皮,那个山东人一个包,3个湖北的供应不上(这是真事,当年在云南一个山沟沟里,俺们3个湖北人和一个山东人的故事) 这事说明什么?这事是说在一个流水线上,步调同步才能玩。你手动1,2,3,4步调一致么,不一致。一次收发缓存可能比1多,也可能比1少。你clientSock.Receive(myReceByte);其实并不是什么收发,只是从接收缓存区里取(就像俺们不是从那个山东人手上接皮子,俺们是从簸箕里去,他先丢簸箕里了,如果手速一样丢1个包1个,如果手速不一样呢?人家擀5个,你包一个。或者你像你说的,你包1个,人家擀了1.5个,比1个多,但不够俩)
小白可以请求进一步说明吗,感激不尽[/quote] 熊猫哥意思是让你用UDP,TCP粘包啦 你想一次发3个240长度的数据 系统可能一次发100,第二次发200,第三次发420 接收也是粘在一起的
裂骨 2019-08-06
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
哎,又是这个。
没有1,2,3,4这种。,解释不了,打比方把

4个人包饺子,一个山东人擀皮,3个湖北人包。山东人擀皮飞快,他一个人擀皮,3个湖北的包都还有富裕的。后来换过来,3个湖北人擀皮,那个山东人一个包,3个湖北的供应不上(这是真事,当年在云南一个山沟沟里,俺们3个湖北人和一个山东人的故事)

这事说明什么?这事是说在一个流水线上,步调同步才能玩。你手动1,2,3,4步调一致么,不一致。一次收发缓存可能比1多,也可能比1少。你clientSock.Receive(myReceByte);其实并不是什么收发,只是从接收缓存区里取(就像俺们不是从那个山东人手上接皮子,俺们是从簸箕里去,他先丢簸箕里了,如果手速一样丢1个包1个,如果手速不一样呢?人家擀5个,你包一个。或者你像你说的,你包1个,人家擀了1.5个,比1个多,但不够俩)
小白可以请求进一步说明吗,感激不尽
wanghui0380 2019-08-06
  • 打赏
  • 举报
回复
哎,又是这个。 没有1,2,3,4这种。,解释不了,打比方把 4个人包饺子,一个山东人擀皮,3个湖北人包。山东人擀皮飞快,他一个人擀皮,3个湖北的包都还有富裕的。后来换过来,3个湖北人擀皮,那个山东人一个包,3个湖北的供应不上(这是真事,当年在云南一个山沟沟里,俺们3个湖北人和一个山东人的故事) 这事说明什么?这事是说在一个流水线上,步调同步才能玩。你手动1,2,3,4步调一致么,不一致。一次收发缓存可能比1多,也可能比1少。你clientSock.Receive(myReceByte);其实并不是什么收发,只是从接收缓存区里取(就像俺们不是从那个山东人手上接皮子,俺们是从簸箕里去,他先丢簸箕里了,如果手速一样丢1个包1个,如果手速不一样呢?人家擀5个,你包一个。或者你像你说的,你包1个,人家擀了1.5个,比1个多,但不够俩)
github_36000833 2019-08-06
  • 打赏
  • 举报
回复
int recv3 = clientSock.Receive(myReceByte3); //数组3
Array.Copy(myReceByte3, 0, myReceByte4, recv1 + recv2, recv3); //复制到4

if (myReceByte4.Count() == 720) 改成
if (recv1 + recv2 + recv3 == 720)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧