介绍
我的客户端应用程序的一个实例将与远程服务器建立两个传出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);
}
}
为了分离问题,我已将代码削减到仅当每次从网络读取一部分数据时服务器只发出异步读取。
请问有人能分享一些见解或猜测,为什么在某些机器上,服务器应用程序不总是能检测到两个套接字的断开连接?
if (socketError == SocketError.Success)
是不必要的。 - bansi文件传输连接保持在半开放状态
是什么意思?如果你试图在第一个连接断开时关闭第二个连接,可能需要将两者关联起来并手动关闭另一个连接。 - bansi