gpt4 book ai didi

c# - 套接字/流关闭时,tcpclient stream.ReadAsync不返回0吗?

转载 作者:行者123 更新时间:2023-12-03 11:53:09 28 4
gpt4 key购买 nike

我正在使用TcpClient.Stream.ReadAsync循环接收数据。传统上,Windows套接字正常关闭时会返回0。使用以下代码,只有当有实际数据时,ReadAsync才会返回唯一的时间。如果我(优雅地或强制性地)关闭了远程应用程序,或者即使我在TcpClient上调用Stream.Close(),则ReadAsync仍然无法完成或引发异常。我如何完成ReadAsync?

var amountRead = await stream.ReadAsync(conn.buffer, 0, Connection.BufferSize, ct);

if (amountRead == 0)
break; //end of stream.
else
{
//Process Received Data here
}

最佳答案

不,ReadAsync的读取语义与BeginReadRead完全相同。读取将在流的末尾返回一个0字节的结果。

远程服务器可能无法正常关闭套接字。面向公众的服务器通常这样做是为了避免4向关闭握手。不幸的是,这意味着您作为客户端需要检测套接字何时关闭。传统上,这是通过使用Keepalive消息或数据包来完成的。我有一个blog post with more details;但关键是必须进行主动检测-即客户端必须发送一些内容以检测连接不再存在。

附带一提,我不确定关闭流会做什么。但是我相当确定关闭套接字(TcpClient)会导致流读取完成并出现错误。

关于c# - 套接字/流关闭时,tcpclient stream.ReadAsync不返回0吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33662928/

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