Tcpclient流.套接字/流关闭时,ReadAsync不返回0

本文关键字:ReadAsync 返回 套接字 Tcpclient | 更新日期: 2023-09-27 18:21:39

我使用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
}

Tcpclient流.套接字/流关闭时,ReadAsync不返回0

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

远程服务器可能没有正常关闭套接字。面向公众的服务器通常这样做是为了避免4向握手。不幸的是,这意味着您作为客户端需要检测套接字何时关闭。传统上,这是通过使用保活消息或数据包来完成的。我有一篇博客文章,里面有更多的细节;但关键是它必须是活动检测,即客户端必须发送一些东西来检测连接是否已不存在。

顺便说一句,我不确定关闭会做什么。但我可以肯定,关闭socketTcpClient)会导致流读取完成并出现错误。