c#socket接收字节数组长度

我正在尝试学习在c#中使用套接字,我有一个疑问,我正在使用这样的代码:

byte[] data = new byte[64]; int length = 0; length = sock.Receive(data); //more code... 

因此, byte[]数据用回收数据填充,数组中的左边空格用0填充, byte[]是否完全分配到内存中(所有64字节)? 如果是这样,有没有办法使byte[]与实际发送的数据大小相同?

你可以检查sock.Available看看已经进来的东西。(到目前为止)

 byte[] data = new byte[sock.Available]; int length = sock.Receive(data); //more code... 

注意:由于您可能知道或者可能不知道网络上接下来会发生什么,因此通常首先只读取标题(带有大小信息)或者分配比必要更多的空间更有意义,并多次调用.Recieve()直到到达记录的结尾。

注意:此代码假设您已经知道有一些数据需要接收,并且您已经等待了足够长的时间来准备好一些有用的数据。

如果你确实选择使用长度标题, .Available可以帮助你避免阅读部分标题并且必须重新组合它,这很好。 (在这种情况下,只有大型消息可能需要手动重组)

如前所述,通常读取后可能会返回更少的字节。 请参阅下面的解决方法函数,该函数确保它读取的字节数与告知的一样多 – 基本上是传递缓冲区的大小。 function来自这里 。

 /// Reads data into a complete array, throwing an EndOfStreamException /// if the stream runs out of data first, or if an IOException /// naturally occurs. ///  /// The stream to read data from /// The array to read bytes into. The array /// will be completely filled from the stream, so an appropriate /// size must be given. public static void ReadWholeArray (Stream stream, byte[] data) { int offset=0; int remaining = data.Length; while (remaining > 0) { int read = stream.Read(data, offset, remaining); if (read <= 0) throw new EndOfStreamException (String.Format("End of stream reached with {0} bytes left to read", remaining)); remaining -= read; offset += read; } } 

您可以首先使用此方法来读取2字节整数 ,该整数应表示将遵循的字节数。 然后你再次阅读,但现在读取该两个字节整数中指定的字节数。

但为了使其工作,显然发送者首先必须发送一个两字节整数,表示将跟随的数据长度 - 然后是数据本身。

所以基本上你首先在大小为2的字节数组上调用上面的函数(以获得数据长度),然后在字节数组上调用大小,如2字节整数所示(以获取数据)。

您可以使用它来从NetworkStream读取。 关于这个主题的更多阅读 。

您只需使用Receive的返回值来了解已到达的数据量。 如果需要,可以使用Array.Resize缩短缓冲区,但这通常表示出现问题。

另请注意,TCP是一个字节流,不保留消息边界。