我正在使用 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
读取语义与 BeginRead
和 Read
完全相同。读取将在流末尾返回 0 字节结果。
远程服务器可能没有正常关闭套接字。面向公众的服务器通常这样做是为了避免四次关闭握手。不幸的是,这意味着您作为客户端需要检测套接字何时关闭。传统上,这是通过使用保活消息或数据包来完成的。我有一个blog post with more details ;但关键是它必须是主动检测 - 即客户端必须发送一些内容来检测连接不再存在。
顺便说一句,我不确定关闭流会做什么。但我相当确定关闭套接字 (TcpClient
) 会导致流读取完成并出现错误。
关于c# - 当套接字/流关闭时,Tcpclient stream.ReadAsync 不返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33662928/