C# .NET TCP服务器稳定性问题

C# .NET TCP服务器稳定性问题,c#,.net,tcp,C#,.net,Tcp,我已经使用TcpListener和SocketClient构建了一个基本的.NET服务器客户端基础结构。 它是多线程和异步的。问题是,当同时连接30多个客户端时,服务器会在某个点崩溃 虽然我确实使用了很多Try-Catch块来确保记录所有异常,但我仍然无法找到崩溃的原因 所以我在想,我可能在服务器代码的概念上做了一些错误的事情。我希望你们能帮我找到那些车祸的原因。代码如下: 正在启动服务器并侦听连接: public void StartServer() { isConn

我已经使用TcpListener和SocketClient构建了一个基本的.NET服务器客户端基础结构。 它是多线程和异步的。问题是,当同时连接30多个客户端时,服务器会在某个点崩溃

虽然我确实使用了很多Try-Catch块来确保记录所有异常,但我仍然无法找到崩溃的原因

所以我在想,我可能在服务器代码的概念上做了一些错误的事情。我希望你们能帮我找到那些车祸的原因。代码如下:

正在启动服务器并侦听连接:

 public void StartServer()
    {
        isConnected = true;
        listener.Start();
        connectionThread = new Thread(new ThreadStart(ListenForConnection));
        connectionThread.Start();
    }

    private void ListenForConnection()
    {
        while (isConnected)
        {
            try
            {
                TcpClient client = listener.AcceptTcpClient();
                ClientConnection connection = new ClientConnection(this, client);
                connections.Add(connection);
            }
            catch (Exception ex)
            {
                log.Log("Exception in ListenForConnection: " + ex.Message, LogType.Exception);
            }
        }
    }
ClientConnection类:

 public class ClientConnection : IClientConnection
{
    private TcpClient client;
    private ISocketServer server;
    private byte[] data;
    private object metaData;

    public TcpClient TcpClient
    {
        get { return client; }
    }

    internal ClientConnection(ISocketServer server, TcpClient client)
    {
        this.client = client;
        this.server = server;

        data = new byte[client.ReceiveBufferSize];

        lock (client.GetStream())
        {
            client.GetStream().BeginRead(data, 0, client.ReceiveBufferSize, ReceiveMessage, null);
        }
    }

    internal void ReceiveMessage(IAsyncResult ar)
    {
        int bytesRead;

        try
        {
            lock (client.GetStream())
            {
                bytesRead = client.GetStream().EndRead(ar);
            }

            if (bytesRead < 1)
                return;

            byte[] toSend = new byte[bytesRead];
            for (int i = 0; i < bytesRead; i++)
                toSend[i] = data[i];

            // Throws an Event with the data in the GUI Dispatcher Thread
            server.ReceiveDataFromClient(this, toSend);

            lock (client.GetStream())
            {
                client.GetStream().BeginRead(data, 0, client.ReceiveBufferSize, ReceiveMessage, null);
            }
        }
        catch (Exception ex)
        {
            Disconnect();
        }
    }

    public void Disconnect()
    {
        // Disconnect Client
    }


}
在某个时候,服务器崩溃了,我真的没有起点去寻找问题。如果需要,我可以提供更多的代码

非常感谢您的帮助:-)
Andrej

您应该使对connections字段的访问是线程安全的

在SendData中,您迭代连接并向每个客户端发送数据。如果在执行foreach循环时连接了新的客户端,则会出现异常消息“Collection was modified;enumeration operation may not execute”(集合已修改;枚举操作可能无法执行),因为在对集合进行迭代时该集合已修改,这是不允许的

将SendDataToAll中的行修改为

foreach (IClientConnection connection in connections.ToList())

要使问题消失(解决方案由提供)。

您应该访问连接字段线程安全

在SendData中,您迭代连接并向每个客户端发送数据。如果在执行foreach循环时连接了新的客户端,则会出现异常消息“Collection was modified;enumeration operation may not execute”(集合已修改;枚举操作可能无法执行),因为在对集合进行迭代时该集合已修改,这是不允许的

将SendDataToAll中的行修改为

foreach (IClientConnection connection in connections.ToList())

要使问题消失(解决方案由提供)。

ClientConnection.ReceiveMessage方法的catch块中的Disconnect调用可能会引发异常,该异常随后会从catch中传播出去,并且未经处理


为了确保捕获所有异常并记录它们,请尝试将事件处理程序注册到AppDomain.CurrentDomain.UnhandledException事件。此外,如果您将服务器作为Windows服务运行,则应用程序事件日志中可能存在.NET异常条目。

ClientConnection.ReceiveMessage方法的catch块中的Disconnect调用可能正在引发异常,该异常随后将从catch中传播出去并未经处理


为了确保捕获所有异常并记录它们,请尝试将事件处理程序注册到AppDomain.CurrentDomain.UnhandledException事件。此外,如果您将服务器作为Windows服务运行,则应用程序事件日志中可能有.NET异常条目。

如果您使用的是Win XP SP2,则可能是这种情况。请参阅否,它托管在Windows Server 2003上。您应该查看未处理的异常事件,以尝试捕获您的异常:如果您使用的是Win XP SP2,则可能是这种情况。请参阅否,它托管在Windows Server 2003上。您应该查看未处理的异常事件,以尝试捕获您的异常:谢谢,这看起来很有希望,我会看看是否有帮助:-)这部分似乎确实导致了一些崩溃。不确定他们是否都走了,但这确实帮了大忙。谢谢。谢谢,这看起来很有希望,我会看看它是否有帮助:-)似乎这部分真的造成了一些崩溃。不确定他们是否都走了,但这确实帮了大忙。谢谢