C# 套接字 如何处理套接字服务器上的计划外断开连接?

C# sockets How can I handle unplanned disconnections on socket servers?

我正在用 C# 构建套接字服务器,但我遇到了计划外套接字断开连接的问题。 现在,我是这样处理的:

private List<TCPClient> _acceptedClientsList = new List<TCPClient>();
public void checkIfStillConnected()
{
    while (true)
    {
        lock (_sync)
        {
            for (int i = 0; i < _acceptedClientsList.Count(); ++i)
            {
                if (_acceptedClientsList[i].Client.Client.Poll(10, SelectMode.SelectRead) == true && (_acceptedClientsList[i]).Client.Client.Available == 0) // 5000 is the time to wait for a response, in microseconds.
                {
                    NHDatabaseHandler dbHandler = new NHDatabaseHandler();
                    dbHandler.Init();
                    if (_acceptedClientsList[i].isVoipClient == true)
                    {
                        dbHandler.UpdateUserStatus(_acceptedClientsList[i].UserName, EStatus.Offline);
                    }
                    RemoveClient(i); // this function removes the selected client at i from the acceptedClientsList
                    i--;
                }
            }
        }
    }
}

但这根本没有优化。这是一个使用 socket.poll 检查每个套接字状态的线程,每次,无限...

我不知道这是否是最好的做法...看起来又重又奇怪。 有人有想法吗?

谢谢

最好有一个专用线程来读取来自每个套接字的传入数据。当发生计划外的套接字断开连接时(例如客户端网络掉线或崩溃),套接字将抛出异常。然后您可以捕获异常,然后关闭套接字连接并干净地结束线程,同时保持其他套接字 运行.

我从本教程中学会了 TCP/IP 通信。

http://www.codeproject.com/Articles/155282/TCP-Server-Client-Communication-Implementation

作者很好地解释了他的实现。值得借鉴。您可以参考它来重写您自己的库。