gpt4 book ai didi

C# 网络流.read()

转载 作者:太空狗 更新时间:2023-10-29 17:50:11 26 4
gpt4 key购买 nike

read(buffer, offset, length) 是如何工作的,如果我将长度传递给 read 作为 32,这是否意味着它会一直阻塞直到它接收到 32 个字节?

我知道它会在套接字异常或连接关闭的情况下分别返回异常或 0。

如果发送方只发送 31 个字节,读取会继续阻塞吗?如果这是真的,是否意味着 read 总是返回等于传递给它的长度的整数?以及如果在特定时间后剩余的 1 个字节没有到来,我如何控制超时。

重要但尚未回答

相比之下,如果发送方发送 32 字节,这是否确保读取会阻塞直到收到所有 32 字节,或者它是否可以在不读取所有 32 字节的情况下出来。

最佳答案

不,它不会阻塞。Read 操作读取尽可能多的可用数据,最多为 size 参数指定的字节数。来源:http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx

鉴于它不会等待额外的 1 个字节,如果您期望它,您应该实现一个循环以继续读取流。您可以随心所欲地退出循环。


更新:当我说“根本没有阻塞。如果没有数据可供读取,Read 方法返回 0”时我错了,但是当我说它不会阻塞等待填充整个缓冲区时我是正确的 这就是 Kazoom 问题中描述的场景。

已更新以证明 NetworkStream.Read 会阻塞等待第一个字节,但不会阻塞等待填充整个缓冲区

创建控制台项目

一方面,您有监听器:


IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
TcpListener listener = new TcpListener(ep);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream s = client.GetStream();
byte[] buffer = new byte[32];
Console.WriteLine(s.Read(buffer, 0, 32));
Console.WriteLine("Press any key to continue...");
Console.Read();

在另一端,我们只发送一个字节:


IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
TcpClient client = new TcpClient();
client.Connect(ep);
client.GetStream().Write(new byte[] { 60 }, 0, 1);
Console.WriteLine("Press any key to continue...");
Console.Read();

双方都会运行,直到到达 Console.Read()。请注意,监听器不会在读取时阻塞。

监听器会打印“1”

关于C# 网络流.read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1365012/

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