套接字未接收所有字节C#.NET

本文关键字:字节 NET 套接字 | 更新日期: 2023-09-27 18:21:26

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

客户端向服务器发送数据:

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

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

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

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

套接字未接收所有字节C#.NET

让我把你在注释中写的代码粘贴到这里:

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字节的TCP段中发送2048字节的数据块。前三个数据包立即到达,但由于网络问题,最后一个数据包丢失,需要重新传输。同时,您已经执行了while (lenght != 0)检查并结束了循环最后一个512字节的片段到达之后,但您错过了它。

您需要做的是将while(lenght != 0)替换为类似while(IDontHaveAllTheDataThatIExpect && !timeout)的东西,这当然假设您事先知道将接收多少数据,或者您可以以某种方式检测到数据的末尾。