我想学习如何在C#中使用socket,我有一个疑问,我正在使用类似于以下代码的东西:
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
可以帮助您避免读取部分标头并且需要重新组装它,这很好。(在这种情况下,只有大型消息可能需要手动重新组装)正如所述,通常情况下read函数可能会返回比它要求的字节数更少的字节。请参考下面的解决方法,它可以确保读取和传递缓冲区大小相同的字节数。该函数来源于这里。
/// Reads data into a complete array, throwing an EndOfStreamException
/// if the stream runs out of data first, or if an IOException
/// naturally occurs.
/// </summary>
/// <param name="stream">The stream to read data from</param>
/// <param name="data">The array to read bytes into. The array
/// will be completely filled from the stream, so an appropriate
/// size must be given.</param>
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;
}
}
你只需要使用Receive
的返回值,就可以了解到有多少数据已经到达。如果你想要缩短缓冲区,可以使用Array.Resize
,但通常这意味着出现了问题。
此外,请注意,TCP是一系列字节流,不保留消息边界。
sock.Available
来查看已经从网络中接收了多少数据。请注意,之后可能会有更多的数据到来。 - ebyrob