写了个socket的小程序,在发送稍微大点的文件的时候会出现接收不全的情况,不知道应该叫断包或者丢包,看了网上说的tcp没有丢包这回事,但是自己可能理解能力的问题还是搞不明白,特来此一问,希望能得到帮助;下面是我截的几张图:
数据小的时候无论图片、文字都能通信,只要稍微大了一小点,数据就接收不全,但是如果设断点调试的话又能都接收到了,对于这方面实在不懂,可能描述的不太好,但是问题应该很清楚,所以请大家帮忙看看,先谢过了
附上我接收的代码:
public static byte[] UnpackingMessage(Socket socket) { Byte[] receiveBytes = new Byte[1024]; try { List<Byte> receiveList = new List<byte>(); Int32 receiveCount = 0;//每次receive的数据长度 do { receiveCount = socket.Receive(receiveBytes, receiveBytes.Length, 0); Byte[] bytes = new Byte[receiveCount]; Buffer.BlockCopy(receiveBytes, 0, bytes, 0, receiveCount); receiveList.AddRange(bytes); } while (socket.Available > 0); Byte[] lenBytes = receiveList.GetRange(1, 7).ToArray(); int len = Convert.ToInt32(Encoding.UTF8.GetString(lenBytes), 16); if (len == (receiveList.Count - 8)) { receiveList.RemoveRange(1, 7); Byte[] objBytes = receiveList.ToArray(); return objBytes; } else { return null; } } catch (SocketException ex) { socket.Close(); return null; } }
断点调试能够成功。说明,是可以成功的。
猜测:你程序的后续处理,在包还没有接收完成就去操作了。
断点调试的时候,给了足够的时间,包接受完成。
TCP方式下不会丢包,这个底层操作系统就给你保证了。
估计你采取的是非阻塞的方式读取的,读的时候对方还没有发送数据呢。
这个小程序能提供 源码吗??!!!
很需要,学习学习!!
现在还有很多问题没解决,所以代码写的乱糟糟的,等我弄的稍微能看点的时候再发给你吧(留个邮箱吧)
@那年的那年: 19442851@163.com 太感谢了!!