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