C# Socket 异步通讯中的问题,望大牛指点!!!!

雪狼孤竹 2017-03-20 12:56:34
工作需要,需要搭建C/S结构的服务。自己在局域网中都没有什么问题,但服务器已部署在云服务器上后,就会出现下述情况。

例如:客户端C1,C2,服务器S
客户端C1,发送5条数据(数据长度不定)(1,2,3,4,5)均单条发送,通过服务器S转发给客户端C2
局域网中: C2收到的数据是正常的5条
1
2
3
4
5
广域网中: C2收到的数据是重复的5条,重复次数和网络状态有关
1
2 3
3 4
4 5
4 5
开始的时候,由于网络延时,加大了发送前的等待时长,不过网络不太稳定,加大了也是临时的解决,并不能彻底解决问题。

我想请教有经验的各位,这类情况,一般都怎么处理?
...全文
469 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪狼孤竹 2017-03-21
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq的回复:
[quote=引用 5 楼 Snowwolf_119 的回复:] [quote=引用 2 楼 xian_wwq 的回复:] 数据“粘包”很正常,因为tcp是基于流的。 并不是客户端发a,b,c,服务端就收到a,b,c 有可能是ab,c,有可能是 a,bc或者abc server需要根据约定的协议来进行分包而不是根据发送的次数。
仔细想想,和你说的这块还是有点出入。 我的问题是,我如果所有数据一次性发送,应该是没有问题的。但分次发送,有的数据就会重复出现。 如果说按a,b,c来说的话,单次发送a,b,c,服务端收到的可能是ab,bc,bc。 这种情况是流数据常出现的吗?怎么来处理?[/quote] 可以肯定这不是tcp的特性, socket通信,数据不会无中生有 数据重复接收是接收侧数据处理的问题[/quote] 谢谢你 我也找到问题了 由于我在S端和C2端都做了简单的处理 所以才出现了我上述所说的情况
xian_wwq 2017-03-20
  • 打赏
  • 举报
回复
引用 5 楼 Snowwolf_119 的回复:
[quote=引用 2 楼 xian_wwq 的回复:] 数据“粘包”很正常,因为tcp是基于流的。 并不是客户端发a,b,c,服务端就收到a,b,c 有可能是ab,c,有可能是 a,bc或者abc server需要根据约定的协议来进行分包而不是根据发送的次数。
仔细想想,和你说的这块还是有点出入。 我的问题是,我如果所有数据一次性发送,应该是没有问题的。但分次发送,有的数据就会重复出现。 如果说按a,b,c来说的话,单次发送a,b,c,服务端收到的可能是ab,bc,bc。 这种情况是流数据常出现的吗?怎么来处理?[/quote] 可以肯定这不是tcp的特性, socket通信,数据不会无中生有 数据重复接收是接收侧数据处理的问题
雪狼孤竹 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
数据“粘包”很正常,因为tcp是基于流的。 并不是客户端发a,b,c,服务端就收到a,b,c 有可能是ab,c,有可能是 a,bc或者abc server需要根据约定的协议来进行分包而不是根据发送的次数。
仔细想想,和你说的这块还是有点出入。 我的问题是,我如果所有数据一次性发送,应该是没有问题的。但分次发送,有的数据就会重复出现。 如果说按a,b,c来说的话,单次发送a,b,c,服务端收到的可能是ab,bc,bc。 这种情况是流数据常出现的吗?怎么来处理?
雪狼孤竹 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 xian_wwq 的回复:
数据“粘包”很正常,因为tcp是基于流的。 并不是客户端发a,b,c,服务端就收到a,b,c 有可能是ab,c,有可能是 a,bc或者abc server需要根据约定的协议来进行分包而不是根据发送的次数。
嗯,我可能知道了。这种只能通过收到后的自行处理来解决。 流这块不是很熟悉,我在看BeginRead,EndRead,BeginWrite,EndWrite后以为能通过某种方式来清空,并单一发送。 所以上来发个帖,问问各位。 如果说这种情况是无法避免的,那我就得着重看我的数据接收处理了。
雪狼孤竹 2017-03-20
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
无法猜测原因,因为我们没看到你任何的处理过程 单从“由于网络延时,加大了发送前的等待时长”这句话来讲,还是最近我们一直在重复的一句话“任何从事socke开发的人员第一要清楚的的事情就是他是strem流式数据,不是你脑袋里那种一条一条发,一条一条收的概念” 所以我们说,只要发送缓冲区没满,你就根本不必做什么“发送前的等待时长”的动作,对于socket首先需要做的几件事情 1.服务器端IOCP 2.客户端及时移除socket缓冲 3.客户端自己处理粘包,半包 ps:从上面的描述你就知道,我们无法猜测原因。我们不知道你服务器端怎么做的是不是按规范的做的,也不知道你客户端又是怎么处理“流式的数据”的
嗯,当我发这贴的时候,我就在想该怎么说明。毕竟我也是刚接触这部分,原来是做硬件设备控制的,习惯了485的方式。所以就在网上找了个比较稳定的源程序根据自己的需要改了改。 这部分自己没有实现Socket的处理,而是用C#中的TcpClient来做的,数据接收也是事件触发的,收到后由我编写的代码来处理。 我困惑的事是接收数据总是在随着网络的情况而改变,或许我数据处理的问题,导致数据重叠后,数据的混乱。
xian_wwq 2017-03-20
  • 打赏
  • 举报
回复
数据“粘包”很正常,因为tcp是基于流的。 并不是客户端发a,b,c,服务端就收到a,b,c 有可能是ab,c,有可能是 a,bc或者abc server需要根据约定的协议来进行分包而不是根据发送的次数。
wanghui0380 2017-03-20
  • 打赏
  • 举报
回复
无法猜测原因,因为我们没看到你任何的处理过程 单从“由于网络延时,加大了发送前的等待时长”这句话来讲,还是最近我们一直在重复的一句话“任何从事socke开发的人员第一要清楚的的事情就是他是strem流式数据,不是你脑袋里那种一条一条发,一条一条收的概念” 所以我们说,只要发送缓冲区没满,你就根本不必做什么“发送前的等待时长”的动作,对于socket首先需要做的几件事情 1.服务器端IOCP 2.客户端及时移除socket缓冲 3.客户端自己处理粘包,半包 ps:从上面的描述你就知道,我们无法猜测原因。我们不知道你服务器端怎么做的是不是按规范的做的,也不知道你客户端又是怎么处理“流式的数据”的

110,539

社区成员

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

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

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