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
作者很好地解释了他的实现。值得借鉴。您可以参考它来重写您自己的库。
我正在用 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
作者很好地解释了他的实现。值得借鉴。您可以参考它来重写您自己的库。