如何正确使用写入固定大小缓冲区(此处为“TcpClient”)的`Read()`方法?

时间:2011-04-05 22:18:07

标签: c# connection tcpclient tcplistener

我正在尝试从TcpClient读取数据,以下是我的工作方式:

var client = tcpListener.AcceptTcpClient();
var data = new byte[client.ReceiveBufferSize];

StringBuilder dataString = new StringBuilder();
using (var ns = client.GetStream())
{
    while (ns.Read(data, 0, client.ReceiveBufferSize) != 0)
    {
        dataString.Append(Encoding.UTF8.GetString(data));
    }
}
client.Close();

问题是我的字符串的长度不是8192(这是client.ReceiveBufferSize的值),因此我在StringBuilder中附加了很多\0

如何才能获得确切的数据量?

1 个答案:

答案 0 :(得分:9)

int readCount;
while ((readCount = ns.Read(data, 0, client.ReceiveBufferSize)) != 0)
{
    dataString.Append(Encoding.UTF8.GetString(data, 0, readCount));
}

编辑:

正如mg30rg在评论中指出的那样,这种方法容易受到连接然后立即断开连接的客户端的攻击。在调用DataAvailable之前,最好先检查Read()属性;否则线程显然会无限期地阻塞。

此外,Connected属性显然会在调用trueRead()之前返回Write(),因此您无法通过使用该属性来检测此情况