cedure SetOnClientError(Value: TSocketErrorEvent); property ServerType: TServerType read GetServerType write SetServerType; property OnGetSocket: TGetSocketEvent read GetGetSocketEvent write SetGetSocketEvent; property OnClientConnect: TSocketNotifyEvent index 2 read GetOnClientEvent write SetOnClientEvent; property OnClientDisconnect: TSocketNotifyEvent index 3 read GetOnClientEvent write SetOnClientEvent; property OnClientRead: TSocketNotifyEvent index 0 read GetOnClientEvent write SetOnClientEvent; property OnClientWrite: TSocketNotifyEvent index 1 read GetOnClientEvent write SetOnClientEvent; property OnClientError: TSocketErrorEvent read GetOnClientError write SetOnClientError; public destructor Destroy; override; end;
TMServerSocket = class(TMCustomServerSocket) public constructor Create(AOwner: TComponent); override; property Socket: TServerWinSocket read FServerSocket; published property Active; property Port; property Service; property ServerType; property OnListen; property OnAccept; property OnGetSocket; property OnClientConnect; property OnClientDisconnect; property OnClientRead; property OnClientWrite; property OnClientError; end;
TSocketErrorProc = procedure (ErrorCode: Integer);
function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc; procedure Register;
implementation
uses Forms, Consts;
threadvar SocketErrorProc: TSocketErrorProc;
var WSAData: TWSAData;
function SetErrorProc(ErrorProc: TSocketErrorProc): TSocketErrorProc; begin Result := SocketErrorProc; SocketErrorProc := ErrorProc; end;
function CheckSocketResult(ResultCode: Integer; const Op: string): Integer; begin if ResultCode <> 0 then begin Result := WSAGetLastError; if Result <> WSAEWOULDBLOCK then if Assigned(SocketErrorProc) then SocketErrorProc(Result) else raise ESocketError.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(Result), Result, Op]); end else Result := 0; end;
procedure Startup; var ErrorCode: Integer; begin ErrorCode := WSAStartup($0101, WSAData); if ErrorCode <> 0 then raise ESocketError.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(ErrorCode), ErrorCode, ''''WSAStartup'''']); end;
procedure Cleanup; var ErrorCode: Integer; begin ErrorCode := WSACleanup; if ErrorCode <> 0 then raise ESocketError.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(ErrorCode), ErrorCode, ''''WSACleanup'''']); end;
{ TCustomWinSocket }
constructor TCustomWinSocket.Create(ASocket: TSocket); begin inherited Create; Startup; FSocketLock := TCriticalSection.Create; FASyncStyles := [asRead, asWrite, asConnect, asClose]; FSocket := ASocket; FAddr.sin_family := PF_INET; FAddr.sin_addr.s_addr := INADDR_ANY; FAddr.sin_port := 0; FConnected := FSocket <> INVALID_SOCKET; end;
destructor TCustomWinSocket.Destroy; begin FOnSocketEvent := nil; { disable events } if FConnected and (FSocket <> INVALID_SOCKET) then Disconnect(FSocket); if FHandle <> 0 then DeallocateHWnd(FHandle); FSocketLock.Free; Cleanup; FreeMem(FGetHostData); FGetHostData := nil; inherited Destroy; end;
procedure TCustomWinSocket.Accept(Socket: TSocket); begin end;
procedure TCustomWinSocket.AsyncInitSocket(const Name, Address, Service: string; Port: Word; QueueSize: Integer; Client: Boolean); begin try case FLookupState of lsIdle: begin if not Client then begin FLookupState := lsLookupAddress; FAddr.sin_addr.S_addr := INADDR_ANY; end else if Name <> '''''''' then begin if FGetHostData = nil then FGetHostData := AllocMem(MAXGETHOSTSTRUCT); FLookupHandle := WSAAsyncGetHostByName(Handle, CM_LOOKUPCOMPLETE, PChar(Name), FGetHostData, MAXGETHOSTSTRUCT); CheckSocketResult(Ord(FLookupHandle = 0), ''''WSAASyncGetHostByName''''); FService := Service; FPort := Port; FQueueSize := QueueSize; FClient := Client; FLookupState := lsLookupAddress; Exit; end else if Address <> '''''''' then begin FLookupState := lsLookupAddress; FAddr.sin_addr.S_addr := inet_addr(PChar(Address)); end else raise ESocketError.CreateRes(@sNoAddress); end; lsLookupAddress: begin if Service <> '''''''' then begin if FGetHostData = nil then FGetHostData := AllocMem(MAXGETHOSTSTRUCT); FLookupHandle := WSAASyncGetServByName(Handle, CM_LOOKUPCOMPLETE, PChar(Service), ''''tcp'''' , FGetHostData, MAXGETHOSTSTRUCT); CheckSocketResult(Ord(FLookupHandle = 0), ''''WSAASyncGetServByName''''); FLookupState := lsLookupService; Exit; end else begin FLookupState := lsLookupService; FAddr.sin_port := htons(Port); end; end; lsLookupService: begin FLookupState := lsIdle; if Client then DoOpen else DoListen(QueueSize); end; end; if FLookupState <> lsIdle then ASyncInitSocket(Name, Address, Service, Port, QueueSize, Client); except Disconnect(FSocket); raise; end; end;
procedure TCustomWinSocket.Close; begin Disconnect(FSocket); end;
procedure TCustomWinSocket.Connect(Socket: TSocket); begin end;
procedure TCustomWinSocket.Lock; begin FSocketLock.Enter; end;
procedure TCustomWinSocket.Unlock; begin FSocketLock.Leave; end;
procedure TCustomWinSocket.CMSocketMessage(var Message: TCMSocketMessage);
function CheckError: Boolean; var ErrorEvent: TErrorEvent 上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 [Sql Server]改进的ASP备份SQL Server数据库
|