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

标签 c# .net sockets async-await

我正在使用 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 字节结果。

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

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

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

相关文章:

C# 使用项目中的每个命名空间

c# - Windows Phone 后台传输和 206 部分响应

sockets - Swift 中的 TCP 套接字

android - AGAIN : read failed, 套接字可能关闭或超时

c++ - 套接字 write() 函数的问题

c# - '' Unable to load DLL ' mfplat.dll' : The specified module could not be found.(HRESULT 异常:0x8007007E)”

c# - Azure 物联网逻辑组件

c# - 为什么不调用此命令?

c# - .NET RSACryptoServiceProvider 使用4096私钥加密,如何在Android上解密

.net - XmlSerializer 是否可以支持循环引用?