套接字未接收所有字节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);
也许这一切都很容易解决,但我第一次使用套接字,我不明白为什么会这样。
让我把你在注释中写的代码粘贴到这里:
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)
的东西,这当然假设您事先知道将接收多少数据,或者您可以以某种方式检测到数据的末尾。