c#ssl流';s read()函数是否知道何时返回0?

c#ssl流';s read()函数是否知道何时返回0?,c#,sockets,sslstream,C#,Sockets,Sslstream,我在c#中设置了一个ssl客户端,目前正在采取措施确保套接字读取尽可能可靠。SslStream.read()文档指出,当没有更多数据可读取时,它返回0,这到底意味着什么?如果存在一些延迟,因此没有准备好读取的数据,该怎么办?SslStream.read()在返回0之前是否有内置超时,或者在确定连接丢失之前是否应该添加一些重试等操作 这是我接收数据的基本工作流程 ulong expected = 8; int offset = 0; int read = 0; do { read = ss

我在c#中设置了一个ssl客户端,目前正在采取措施确保套接字读取尽可能可靠。SslStream.read()文档指出,当没有更多数据可读取时,它返回0,这到底意味着什么?如果存在一些延迟,因此没有准备好读取的数据,该怎么办?SslStream.read()在返回0之前是否有内置超时,或者在确定连接丢失之前是否应该添加一些重试等操作

这是我接收数据的基本工作流程

ulong expected = 8;
int offset = 0;
int read = 0;
do
{
    read = sslStream.Read(buffer, offset, expected - offset);
    offset += read;
} while (offset != expected && read != 0);

expected = byte8toulong(buffer);
Array.Clear(buffer, 0, buffer.Length);
read = 0;
offset = 0;

do
{
    // The same as above but saving the data as it comes in.
} while(offset != expected && read != 0);

我想我的问题是,在什么情况下,read==0?延迟是否导致它返回0?我是否应该添加一个计时器/重试,直到我确信连接已关闭,或者Read()已执行类似操作?

套接字读取或写入应始终能够捕获异常(服务器端或客户端连接断开),将其包装在try catch中


如果接收到0,请继续读取,因为这并不表示任何一方都断开连接,直到您愿意设置某种超时为止。(例外情况将处理大部分情况)但即使服务器连接关闭,客户端连接也可以保持打开状态,即使客户端关闭,服务器连接也可以保持打开状态。

您可能需要对流的工作原理进行一些研究。我非常确定读取流时的失败,或者连接中的任何中断都会导致异常。否则,您将从流中读取数据,直到没有剩余的内容可读取为止,即
read()
返回0。如果有延迟,它将等待数据,但不会因此返回0。Read在流“结束”时为.NET中的所有流返回0,这是一种约定。在基于TCP的通信中,0表示另一方发送FIN,关闭发送通道的一半。因此,底层网络堆栈“知道”不再接收数据。除了不必要的丰富多彩的语言之外,这些都与
SslStream
无关。流不是套接字。如果
Stream.Read
返回0,即使流从网络读取数据,也不会有更多的数据。