Socket没有收到所有字节C#.NET

时间:2015-11-11 12:03:19

标签: c# .net sockets

我在使用套接字时遇到了问题。我有一个客户端到服务器应该发送截图。问题是服务器没有从客户端发送的数组中接收所有字节。通常缺少255个字节(多次检查)。因此,在服务器端,我无法执行从字节数组到图像的转换。

客户端将数据发送到服务器:

byte[] bytesforSend = ConvertBitmapToByteArray(GetScreenImage());
client.Send(bytesforSend, bytesforSend.Length, 0);

服务器从客户端收到数据:

int lenght = cl.socket.Receive(bytes);

也许所有这些都很容易解决,但我第一次使用套接字并且我不明白为什么会这样。

1 个答案:

答案 0 :(得分:0)

让我在这里粘贴你在评论中写的代码:

var myObject = {first: true, second: false, third: true};
var myKeys = Object.keys(myObject);    //['first', 'second','third']

这里最可能出现的问题(我在与相机通信的商业图书馆中看到类似的问题)是你假设所有数据会同时到达目的地,但这不是真的,这取决于关于网络条件或客户端实际发送数据的方式。

假设客户端在四个512字节的TCP段中发送一个2048字节的数据块。前三个立即到达,但由于某些网络问题,最后一个数据包丢失,需要重新传输。与此同时,您已经执行了List<byte[]> recievingBytes = new List<byte[]>(); List<int> lenghts = new List<int>(); int lenght; do { lenght = cl.socket.Receive(bytes); recievingBytes.Add(bytes); lenghts.Add(lenght); } while (lenght != 0); 检查并结束了循环。 之后,最后一个512字节的片段到了,但你错过了它。

您需要做的是将while (lenght != 0)替换为while(lenght != 0)之类的内容,这当然要假设您事先知道将收到多少数据,或者您可以以某种方式检测到数据。