Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在客户端内部崩溃时停止服务器崩溃(TCP/IP套接字)_C#_Sockets_Tcp_Server_Client - Fatal编程技术网

C# 如何在客户端内部崩溃时停止服务器崩溃(TCP/IP套接字)

C# 如何在客户端内部崩溃时停止服务器崩溃(TCP/IP套接字),c#,sockets,tcp,server,client,C#,Sockets,Tcp,Server,Client,关于问题的描述 目前,我正在csharp中开发服务器多客户端(超过3000个客户端)应用程序。服务器和客户端交换消息。问题是,如果任何客户端由于内部原因崩溃,服务器就会崩溃。内部原因可能包括客户端计算机的各种特定问题。例如,它们可能是失去互联网连接、计算机崩溃、电源故障等 由于服务器的功能是传递实时信息,如果服务器崩溃,则整个操作将停止。这对于服务器来说是一场噩梦,因为我们无法预测哪个客户端将崩溃 导致服务器崩溃的主要代码如下: public bool Send(byte[] buffe

关于问题的描述

目前,我正在csharp中开发服务器多客户端(超过3000个客户端)应用程序。服务器和客户端交换消息。问题是,如果任何客户端由于内部原因崩溃,服务器就会崩溃。内部原因可能包括客户端计算机的各种特定问题。例如,它们可能是失去互联网连接、计算机崩溃、电源故障等

由于服务器的功能是传递实时信息,如果服务器崩溃,则整个操作将停止。这对于服务器来说是一场噩梦,因为我们无法预测哪个客户端将崩溃

导致服务器崩溃的主要代码如下:

    public bool Send(byte[] buffer)
    {
        if (m_Socket == null)
        {
            return (false);
        }


        try
        {
            mSocket.Send(buffer);

            return (true);
        }
        catch(System.Net.Sockets.SocketException ex)
        {
            mSocket = null;
            return (false);
        }

        return (false);
    }
我认为从我的研究中,类似的问题几乎没有答案。然而,答案经常指出使用保持活动的数据包

我认为这个网站上的许多答案表明,如果不使用来自客户端的keep-alive数据包,检测半开放连接(断开连接)几乎是不可能的

在我们的应用程序中,我们不喜欢使用Keep-alive数据包或消息,因为服务器和客户端的通信时间是毫秒。从服务器的资源管理角度来看,每秒从3000多个客户端接收keep-alive数据包或消息似乎并不友好。因此,我们希望有一个相当好的错误管理。如果客户端计算机崩溃,那么我们只想忽略它。我不确定这是否会使正在运行的服务器不稳定

不管怎么说,我想出了一些关于以下选项的想法。大多数时候,这是来自网络上其他程序员的建议。因此,问题是哪一个选项可能是安全捕获Socket.Send()失败错误和不干扰服务器操作的最佳选项

  • 使用简单的try-catch语句。这是否会为该问题提供100%安全的故障安全操作?根据我的经验,有时它有效,但有时不起作用

    try
    {
        mSocket.Send(buffer);
    
        return (true);
    }
    catch(System.Net.Sockets.SocketException ex)
    {
        mSocket = null;
        return (false);
    }
    
  • 使用while(true)循环。有人提到while(true)循环可能是安全的方法。然而,与简单的try-catch语句相比,我不确定这个解决方案有多有效

  • 在其他线程而不是主线程内执行Socket.Send()函数。其思想是,如果Socket.Send()函数失败,那么用于Socket.Send()函数的线程将自行终止,而不会干扰应用程序的主线程。但是,我没有足够的知识知道每个线程如何相互作用。因此,我无法判断这种方法是否比上述两种方法更好


  • 你能为这个具体问题提出一些想法或解决方案吗?我认为,如果不使用Keep-alive数据包,在不崩溃的情况下维护服务器操作是一个非常具有挑战性的问题。

    Catch
    Exception
    而不是
    SocketException
    ,这将确保服务器永远不会崩溃。另外,请确保读取循环受到try/Catch的保护。谢谢您的评论。什么是读取循环?在服务器上,您是在循环中读取还是使用异步事件读取?我使用异步事件。