|
FLookupHandle := 0;
if (Socket = INVALID_SOCKET) or (Socket <> FSocket) then exit;
Event(Self, seDisconnect);
CheckSocketResult(closesocket(FSocket), ''''closesocket'''');
FSocket := INVALID_SOCKET;
FAddr.sin_family := PF_INET;
FAddr.sin_addr.s_addr := INADDR_ANY;
FAddr.sin_port := 0;
FConnected := False;
FreeAndNil(FSendStream);
finally
Unlock;
end;
end;
CheckSocketResult(closesocket(FSocket), ''''closesocket'''');这一句即完成了Socket的关闭了。
通信完后,两个类都要释放了,在析构函数中做一些收尾的工作,大想也可以猜它要做什么了。
先来看看ServerSocket的析构函数:
(52)
destructor TCustomServerSocket.Destroy;
begin
FServerSocket.Free;
inherited Destroy;//这是TComponent的析构函数
end;
先释放FServerSocket,再调用父类的析构函数,一个个来看。它到底做了些什么收尾的工作。
(521)
destructor TServerWinSocket.Destroy;
begin
inherited Destroy;
FConnections.Free;
FActiveThreads.Free;
FListLock.Free;
end;
没有什么可说的,再追上去:
(5211)
destructor TCustomWinSocket.Destroy;
begin
FOnSocketEvent := nil; { disable events }
if FConnected and (FSocket <> INVALID_SOCKET) then
Disconnect(FSocket);
//释放由AllocateHWnd.生成的窗口。
if FHandle <> 0 then DeallocateHWnd(FHandle);
FSocketLock.Free;
Cleanup;
FreeMem(FGetHostData);
FGetHostData := nil;
inherited Destroy;//这是TObject的析构函数
end;
看下去:
procedure Cleanup;
var
ErrorCode: Integer;
begin
ErrorCode := WSACleanup;
if ErrorCode <> 0 then
raise ESocketError.CreateResFmt(@sWindowsSocketError,
[SysErrorMessage(ErrorCode), ErrorCode, ''''WSACleanup'''']);
end;
总算是最后了,看到SocketAPI的调用了吗。
那么ClientSocket的呢:
(53)
destructor TClientSocket.Destroy;
begin
FClientSocket.Free;
inherited Destroy; //这是TComponent的析构函数
end;
我们已经很有经验了,看FClientSocket的析构函数去,但ClientSocket没有构析函数,他的父类才有,即我们说到的TCustomWinSocket,那么一切都结束了。
这一大块,非阻塞式的一次操作就这样结束了。请各位对着源代码看吧,多跟踪一下,也许发现的东西比我还多。如果下次有机会,我会进行一次阻塞式的代码阅读的。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 没有相关教程
|