110,535
社区成员
发帖
与我相关
我的任务
分享
public void Close()
{
_isDisposing = true;
if (_tcpClient.Connected)
_tcpClient.Close();
_isDisposing = false;
}
private void MainLoop()
{
NetworkStream stream = _tcpClient.GetStream();
byte[] buffer = new byte[BUFFER_SIZE];
while (stream.CanRead)
{
int received;
try
{
received = stream.Read(buffer, 0, BUFFER_SIZE);
}
catch (SocketException)
{
break;
}
catch (System.IO.IOException)
{
break;
}
if (received == 0)
{
break;
}
else if (!_isDisposing)
{
byte[] data = new byte[received];
Array.Copy(buffer, data, received);
_dataArrivedCallback(this, data);
}
}
_closedCallback(this);
Console.WriteLine("Disconnected from " + _endPoint.Address);
}
已经尽可能考虑到断开连接可能发生的情况,捕捉断开应该是没有问题的。另外,S和T上都不是我写的程序,也没办法改,我的程序只做数据转发,要增加心跳的功能不太现实。
我查了一些Socket的资料,说服务端打算断开连接时向客户端发送一个FIN包后随即进入FIN_WAIT_1状态,等到客户反馈的FIN/ACK包后,转入FIN_WAIT_2。
由于SR的连接被S断开的情况比较多,所以我认为SR断开的情况是已经检测到了,而问题在于RT的Socket没有断开,在R上没有收到T反馈的FIN/ACK。