C# 什么';检查Tcp断开连接的最佳方法是什么?

C# 什么';检查Tcp断开连接的最佳方法是什么?,c#,C#,我正在用C#制作一个使用TCP的聊天程序,在处理断开连接时遇到了问题。我需要确保我能够检测到断开连接,无论是手动断开还是客户端只是断开连接 我尝试过关闭客户端和流,但他们没有像他们认为的那样在服务器中抛出异常 还有,这样做有必要吗 byte[] receive = new byte[10240]; int bytesReceived = 0; try { while (bytesReceived < receive.Length) { bytesRecei

我正在用C#制作一个使用TCP的聊天程序,在处理断开连接时遇到了问题。我需要确保我能够检测到断开连接,无论是手动断开还是客户端只是断开连接

我尝试过关闭客户端和流,但他们没有像他们认为的那样在服务器中抛出异常

还有,这样做有必要吗

byte[] receive = new byte[10240];
int bytesReceived = 0;

try
{
    while (bytesReceived < receive.Length)
    {
        bytesReceived += Stream.Read(receive, 0, receive.Length);
    }
 }

干净地关闭连接不会产生异常;它将导致
.Read
调用返回读取0字节。这应该用作停止接收的信号(因此,显然,您的循环不正确,也不必要--
Stream.Read
将不会返回,直到您要求的全部读取完毕,或者没有更多的内容可读取;
Socket.Receive
是另一回事)。在发送方,只有在第一次尝试通过不再存在的连接发送数据时,才会检测到断开连接。大多数需要更多即时检测的应用程序都会定期使用keepalive信号。无关:
if(e.InnerException.GetType()==typeof(SocketException)){SocketException SocketException=(SocketException)e.InnerException;
=
if(e.InnerException是SocketException socketEx)
要短得多,而且可读性仍然很好。
            byte[] receive = new byte[10240];
            int bytesRead = 0;

            try
            {
                bytesRead = Stream.Read(receive, 0, receive.Length);
            }
            catch (IOException e)
            {
                if (e.InnerException.GetType() == typeof(SocketException))
                {
                    SocketException socketExc = (SocketException)e.InnerException;

                    if (socketExc.SocketErrorCode == SocketError.Interrupted)
                    {
                        Running = false;
                        continue;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
            }

            if (bytesRead == 0)
            {
                Running = false;
                continue;
            }