介绍
我的客户端应用程序的一个实例将与远程服务器建立两个传出 TCP 连接 - 一个主连接和一个文件传输连接。
当客户端应用程序被强制关闭时 - 有时服务器不会确认两个套接字连接都已被丢弃。
服务器将检测到两个连接都已被丢弃,或者仅主连接已被丢弃,这是不希望的。
了解问题仅出现在几台测试机中的一台上,并且在客户端被强制关闭时文件传输连接正在主动传输数据。
在分析了网络流量之后——我了解到操作系统实际上是在确认两个RST标志!因此,我倾向于认为问题出在服务器代码上。
代码
使用该Socket.BeginReceive
方法,我主要负责检测断开连接的回调如下所示:
private void ReadCallback(IAsyncResult asyncResult)
{
try
{
int bytesTransferred = _clientSocket.EndReceive(asyncResult);
_logger.Debug(GetHashCode() + " Received " + bytesTransferred + " bytes from " + RemoteEndPoint);
if (bytesTransferred > 0)
{
_clientSocket.BeginReceive(_readMessageBuffer, ReadCallback);
_logger.Debug(GetHashCode() + " Issued asynchronous read for " + RemoteEndPoint);
}
else
{
_logger.Debug(GetHashCode() + " Client disconnected. Received zero bytes. ");
}
}
catch (SocketException socketException)
{
_logger.DebugException(GetHashCode() + " Client disconnected. SocketException thrown", socketException);
}
catch (ObjectDisposedException objectDisposedException)
{
_logger.DebugException(GetHashCode() + " Client disconnected. ObjectDisposedException thrown", objectDisposedException);
}
catch (Exception exception)
{
_logger.DebugException(GetHashCode() + " Client disconnected. Exception thrown", exception);
}
}
为了隔离问题,我已经剥离了代码,以便服务器每次从网络读取一部分数据时才发出异步读取。
有人可以分享一些见解或推测,为什么在某些机器上服务器应用程序不会总是检测到两个套接字断开连接?