当前位置: 代码迷 >> C# >> C# TCP通讯 大家帮小弟我看一下这个有关问题产生的原因
  详细解决方案

C# TCP通讯 大家帮小弟我看一下这个有关问题产生的原因

热度:90   发布时间:2016-05-05 04:25:57.0
C# TCP通讯 大家帮我看一下这个问题产生的原因
用C#做了一个TCP通讯的客户端,连接到无线射频的服务器上,发送和接受数据都是HEX,正常下我接收到的数据应该是(循环发送):
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67
可在接收到的所有数据中总有几个这样的:
00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 38 38 38 38 20 0F 01 02

也就是说有一条数据是的前端没有被接收,通过断行可以看出如下:
00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 01 67 
38 38 38 38 20 0F 01 02
或者说是错位了。由于要统计丢包率(发送350次大约有10个数据是以上情况,其余的接收是正常的),所以还是想弄清楚是什么原因,是我接收程序的原因,还是无线端硬件的原因,我确定不了,希望懂的大神回答一下下。。。
------解决思路----------------------


是你的协议没处理好TCP贴包造成的
------解决思路----------------------
循环发送造成粘包。。。太正常了
------解决思路----------------------
http://blog.csdn.net/binghuazh/article/details/4222516
------解决思路----------------------
自己做个缓冲区,然后自己给指令分段。
------解决思路----------------------
你这个要做根据包头 包尾做合包处理的。参考我之前的帖子。
http://bbs.csdn.net/topics/390993957
------解决思路----------------------
那你只好改成同步通信机制,发送一次,接收一次,不要一下发送好多数据,然后接收到好多数据,你就分不清接收到的数据到底谁是谁了
------解决思路----------------------
发送太频繁就会出现这情况。
你在你的发送的方法加个Thread.Sleep(1) ;应能解决这问题 
之前写TCP C/S服务端时也是出现这情况,每秒1000个包,并发容易造成数据错位
------解决思路----------------------
如果硬要掩盖设计错误而不得其法,那就只有换人了。
------解决思路----------------------
你这个是接收部分的问题,不是发方没发,而是你没收。
应该说是它发送一条数据的过程中,你开启了接收部分,所以应该是初始一条数据有丢失。
还有当你停止接收时,最后一条数据的不全。
如果你的接收部分一直开启,并且信号很好,那么之后的数据应该就不会缺东少西。之后信号不稳,造成的数据不全,就是你所要统计的丢包数据。


------解决思路----------------------
用同步方式,发送完一次,马上开始接收,等接收完再发下一个数据,也会这样??
------解决思路----------------------
所以你这从根本上还是异步,只不过你没用类库自带的BeginRecieve,而是自己开了个线程去接收

你这发送和接收根本就是两个分开的过程,而不是一定要在发送之后才接收啊
------解决思路----------------------


无力吐嘈。。。。你这玩意是用同步阻塞模式+线程异步,而不是Socket自身的异步。。
------解决思路----------------------
总体思路:
先把发送的数据格式化一下。报头+长度+正文+报尾
写个缓冲区,先把数据读到缓冲区。
接收时合理的判断缓冲区的数据,由于数据已经按我们预先定义的格式发了,就可以轻松把粘在一起的两个包分开了
你参考下这个人的博客,就可以实现了
http://blog.csdn.net/wyd1520/article/details/23822313
  相关解决方案