以下是本菜鸟做的一个改进的Socket控件,有兴趣的小侠可以down下玩玩,顺便提提意见。
unit MScktComp; interface
uses SysUtils, Windows, Messages, Classes, WinSock, SyncObjs;
const CM_SOCKETMESSAGE = WM_USER + $0001; CM_DEFERFREE = WM_USER + $0002; CM_LOOKUPCOMPLETE = WM_USER + $0003;
type ESocketError = class(Exception);
TCMSocketMessage = record Msg: Cardinal; Socket: TSocket; SelectEvent: Word; SelectError: Word; Result: Longint; end;
TCMLookupComplete = record Msg: Cardinal; LookupHandle: THandle; AsyncBufLen: Word; AsyncError: Word; Result: Longint; end;
TCustomWinSocket = class; TMCustomSocket = class; TServerWinSocket = class; TServerClientWinSocket = class; // TConManageThread = class;
TServerType = (stNonBlocking); TClientType = (ctNonBlocking); TAsyncStyle = (asRead, asWrite, asOOB, asAccept, asConnect, asClose); TAsyncStyles = set of TAsyncStyle; TSocketEvent = (seLookup, seConnecting, seConnect, seDisconnect, seListen, seAccept, seWrite, seRead); TLookupState = (lsIdle, lsLookupAddress, lsLookupService); TErrorEvent = (eeGeneral, eeSend, eeReceive, eeConnect, eeDisconnect, eeAccept);
TSocketEventEvent = procedure (Sender: TObject; Socket: TCustomWinSocket; SocketEvent: TSocketEvent) of object; TSocketErrorEvent = procedure (Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer) of object; TGetSocketEvent = procedure (Sender: TObject; Socket: TSocket; var ClientSocket: TServerClientWinSocket) of object; TSocketNotifyEvent = procedure (Sender: TObject; Socket: TCustomWinSocket) of object;
TCustomWinSocket = class private FSocket: TSocket; FConnected: Boolean; FHandle: HWnd; FAddr: TSockAddrIn; FAsyncStyles: TASyncStyles; FLookupState: TLookupState; FLookupHandle: THandle; FOnSocketEvent: TSocketEventEvent; FOnErrorEvent: TSocketErrorEvent; FSocketLock: TCriticalSection; FGetHostData: Pointer; FData: Pointer; // Used during non-blocking host and service lookups FService: string; FPort: Word; FClient: Boolean; FQueueSize: Integer; procedure WndProc(var Message: TMessage); procedure CMLookupComplete(var Message: TCMLookupComplete); message CM_LOOKUPCOMPLETE; procedure CMSocketMessage(var Message: TCMSocketMessage); message CM_SOCKETMESSAGE; procedure CMDeferFree(var Message); message CM_DEFERFREE; procedure DeferFree; procedure DoSetAsyncStyles; function GetHandle: HWnd; function GetLocalHost: string; function GetLocalAddress: string; function GetLocalPort: Integer; function GetRemoteHost: string; function GetRemoteAddress: string; function GetRemotePort: Integer; function GetRemoteAddr: TSockAddrIn; protected procedure AsyncInitSocket(const Name, Address, Service: string; Port: Word; QueueSize: Integer; Client: Boolean); procedure DoOpen; procedure DoListen(QueueSize: Integer); function InitSocket(const Name, Address, Service: string; Port: Word; Client: Boolean): TSockAddrIn; procedure Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); dynamic; procedure Error(Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); dynamic; procedure SetAsyncStyles(Value: TASyncStyles); public constructor Create(ASocket: TSocket); destructor Destroy; override; procedure Close; procedure DefaultHandler(var Message); override; procedure Lock; procedure Unlock; procedure Listen(const Name, Address, Service: string; Port: Word; QueueSize: Integer; Block: Boolean = True); procedure Open(const Name, Address, Service: string; Port: Word; Block: Boolean = True); procedure Accept(Socket: TSocket); virtual; procedure Connect(Socket: TSocket); virtual; procedure Disconnect(Socket: TSocket); virtual; procedure Read(Socket: TSocket); virtual; procedure Write(Socket: TSocket); virtual; function LookupName(const name: string): TInAddr; function LookupService(const service: string): Integer;
function ReceiveLength: Integer; function ReceiveBuf(var Buf; Count: Integer): Integer; function ReceiveText: string; function SendBuf(var Buf; Count: Integer): Integer; function SendText(const S: string): Integer;
property LocalHost: string read GetLocalHost; property LocalAddress: string read GetLocalAddress; property LocalPort: Integer read GetLocalPort;
property RemoteHost: string read GetRemoteHost; property RemoteAddress: string read GetRemoteAddress; property RemotePort: Integer read GetRemotePort; property RemoteAddr: TSockAddrIn read GetRemoteAddr;
property Connected: Boolean read FConnected; property Addr: TSockAddrIn read FAddr; property ASyncStyles: TAsyncStyles read FAsyncStyles write SetAsyncStyles; property Handle: HWnd read GetHandle; property SocketHandle: TSocket read FSocket; property LookupState: TLookupState read FLookupState;
property OnSocketEvent: TSocketEventEvent read FOnSocketEvent write FOnSocketEvent; property OnErrorEvent: TSocketErrorEvent read FOnErrorEvent write FOnErrorEvent;
property Data: Pointer read FData write FData; end;
TClientWinSocket = class(TCustomWinSocket) private FClientType: TClientType; protected procedure SetClientType(Value: TClientType); public procedure Connect(Socket: TSocket); override; property ClientType: TClientType read FClientType write SetClientType; end;
TServerClientWinSocket = class(TCustomWinSocket) private FServerWinSocket: TServerWinSocket; public constructor Create(Socket: TSocket; ServerWinSocket: TServerWinSocket); destructor Destroy; override;
property ServerWinSocket: TServerWinSocket read FServerWinSocket; end; file://*************************************************** // 定义一个接收线程 {TServerAcceptThread = class(TThread) private FServerSocket: TServerWinSocket; public constructor Create(CreateSuspended: Boolean; ASocket: TServerWinSocket); destructor destroy ;override; procedure Execute; override; procedure Accept(socket:Tsocket); property ServerSocket: TServerWinSocket read FServerSocket; end; file://****************************************************
file://***************************************************** // 定义一个连接管理线程 {ConManageThread = class(TThread) private FClientSocket: TServerClientWinSocket; FServerSocket: TServerWinSocket; FException: Exception; FEvent: TSimpleEvent; FKeepInCache: Boolean; FData: Pointer; procedure HandleEvent(Sender: TObject; Socket: TCustomWinSocket; SocketEvent: TSocketEvent); procedure HandleError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure DoHandleException; procedure DoRead; procedur [1] [2] [3] [4] [5] [6] [7] 下一页 [Sql Server]改进的ASP备份SQL Server数据库
|