indy10中TIdTCPClient控件Disconnect源码:
procedure TIdTCPConnection.Disconnect(ANotifyPeer: Boolean); var // under ARC, convert a weak reference to a strong reference before working with it LIOHandler: TIdIOHandler; begin try // Separately to avoid calling .Connected unless needed if ANotifyPeer then begin // overriden. Ideally, Connected() should be called by overridden // DisconnectNotifyPeer() implementations if they really need it. But // to avoid any breakages in third-party overrides, we could check here // if DisconnectNotifyPeer() has been overridden and then call Connected() // to maintain existing behavior... // if Connected then begin DisconnectNotifyPeer; end; end; finally { there are a few possible situations here: 1) we are still connected, then everything works as before, status disconnecting, then disconnect, status disconnected 2) we are not connected, and this is just some "rogue" call to disconnect(), then nothing happens 3) we are not connected, because ClosedGracefully, then LConnected will be false, but the implicit call to CheckForDisconnect (inside Connected) will call the events } // We dont check connected here - we realy dont care about actual socket state // Here we just want to close the actual IOHandler. It is very possible for a // socket to be disconnected but the IOHandler still open. In this case we only // care of the IOHandler is still open. // // This is especially important if the socket has been disconnected with error, at this // point we just want to ignore it and checking .Connected would trigger this. We // just want to close. For some reason NS 7.1 (And only 7.1, not 7.0 or Mozilla) cause // CONNABORTED. So its extra important we just disconnect without checking socket state. LIOHandler := IOHandler; if Assigned(LIOHandler) then begin if LIOHandler.Opened then begin DoStatus(hsDisconnecting); LIOHandler.Close; DoOnDisconnected; DoStatus(hsDisconnected); //LIOHandler.InputBuffer.Clear; end; end; end; end;
注释:
{
// CONNABORTED. So its extra important we just disconnect without checking socket state.
中文翻译(可能不是很准确):
一些可能的情况:
1)正常连接,在其他事情发生之前,状态变为断开连接中,然后断开连接,最后状态变为断开连接;
2)没有连接,并且只是有一些流氓调用断开连接函数,那么什么事也不会发生;
3)没有连接,但因为ClosedGracefully(不知道怎么翻译好),那么Lconnected会出错,除非显示调用CheckForDisconnect。
另外附上源码中的CheckForDisconnect原型与注解。
// CheckForDisconnect allows the implementation to check the status of the // connection at the request of the user or this base class. procedure CheckForDisconnect(ARaiseExceptionIfDisconnected: Boolean = True; AIgnoreBuffer: Boolean = False); virtual; abstract;
根据源码某处的注解
// Check here as other side may have closed connection CheckForDisconnect(ARaiseExceptionIfDisconnected);
中文翻译:在这里检查另一端是否已经关闭连接
所以,我认为CheckForDisconnect是用来检查对方连接是否断开的函数。