c# sockets 接收数据的有关问题

c# sockets 接收数据的问题
我的代码是这样的:
            bytesRead = socket.Receive(recvBytes, recvBytes.Length, 0);
            //System.Threading.Thread.Sleep(1000);
            while (bytesRead > 0)
            {
             //if (bytesRead < recvBytes.Length)
                //{
                //    recvBytes[bytesRead] = 0;
                //}
                recvBuf += Encoding.UTF8.GetString(recvBytes);
                bytesRead = socket.Receive(recvBytes, recvBytes.Length, 0);
            }


如果加上中间这一段:
                //if (bytesRead < recvBytes.Length)
                //{
                //    recvBytes[bytesRead] = 0;
                //}

的情况下,必须加上延迟1秒的延迟,不然就接受不到完整的数据。
如果不加延迟也不加判断是否结尾的话,就能收到完整的数据,但是也有冗余的数据,因为byte没有被清空

请问这是怎么回事?
------解决思路----------------------
MemoryStream ms = new MemoryStream();
bytesRead = socket.Receive(recvBytes, recvBytes.Length, 0);
while (bytesRead > 0)
{
ms.Write(recvBytes, 0, bytesRead);
bytesRead = socket.Receive(recvBytes, recvBytes.Length, 0);
}
recvBuf = Encoding.UTF8.GetString(ms.ToArray());

写法有问题,应该等所有数据收齐了再转为字符串的
------解决思路----------------------
之前我贴过一个例子代码 http://bbs.csdn.net/topics/390987992

1. 如果你的通讯协议是以某个“长度”为标识消息结束位置的,那你可以修改我的 ExecuteCommand 方法里边的3、4行代码,把我的“查找回车换行符号”为结束判断的代码改为“直接判断是否有足够的长度的字节”的代码。
2. 如果你的消息是二进制而不是string,则可以把我的 command =.... 那行代码改为直接截取 container.ToArray().Take(i) 取前 i 个字节作为消息。

其它的流程基本上是完全一样的。这里要注意的是:tcp消息是会自动“分包、粘包”的,不但是底层数据包如此,在应用层数据包也如此。如果对方一次性发送600个字节然后再发送2991个字节,你可能一次性收到591个字节,然后下一次收到了3000个字节,这是正常的tcp通讯。
------解决思路----------------------
这种情况,应该用2个线程。一个线程用于接受数据,一个线程用于处理数据。接受数据的时候 会出现 冗余数据正常。不用管它,就在你 处理数据的线程中,处理不需要的数据,把正确的数据校验出来处理。