gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:32:21 25 4
gpt4 key购买 nike

我正在尝试从 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 的值),因此我附加了很多 \0 在我的 StringBuilder 中。

如何才能只获取准确数量的数据?

最佳答案

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

编辑:

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

此外,Connected 属性显然会返回 true,直到调用 Read()Write() ,因此您将无法使用该属性检测到这种情况。

关于c# - 如何正确使用写入固定大小缓冲区(此处为 `Read()` )的 `TcpClient` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com