AsyncInitSocket(Name, Address, Service, Port, QueueSize, False); except Disconnect(FSocket); raise; end; end;
procedure TCustomWinSocket.Open(const Name, Address, Service: string; Port: Word; Block: Boolean); begin if FConnected then raise ESocketError.CreateRes(@sSocketAlreadyOpen); FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP); if FSocket = INVALID_SOCKET then raise ESocketError.CreateRes(@sCannotCreateSocket); try Event(Self, seLookUp); if Block then begin FAddr := InitSocket(Name, Address, Service, Port, True); DoOpen; end else AsyncInitSocket(Name, Address, Service, Port, 0, True); except Disconnect(FSocket); raise; end; end;
procedure TCustomWinSocket.Disconnect(Socket: TSocket); begin Lock; try if FLookupHandle <> 0 then CheckSocketResult(WSACancelASyncRequest(FLookupHandle), ''''WSACancelASyncRequest''''); 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; finally Unlock; end; end;
procedure TCustomWinSocket.DefaultHandler(var Message); begin with TMessage(Message) do if FHandle <> 0 then Result := CallWindowProc(@DefWindowProc, FHandle, Msg, wParam, lParam); end;
procedure TCustomWinSocket.Event(Socket: TCustomWinSocket; SocketEvent: TSocketEvent); begin if Assigned(FOnSocketEvent) then FOnSocketEvent(Self, Socket, SocketEvent); end;
procedure TCustomWinSocket.Error(Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin if Assigned(FOnErrorEvent) then FOnErrorEvent(Self, Socket, ErrorEvent, ErrorCode); end;
function TCustomWinSocket.SendText(const s: string): Integer; begin Result := SendBuf(Pointer(S)^, Length(S)); end;
function TCustomWinSocket.SendBuf(var Buf; Count: Integer): Integer; var ErrorCode: Integer; begin Lock; try Result := 0; if not FConnected then Exit; Result := send(FSocket, Buf, Count, 0); if Result = SOCKET_ERROR then begin ErrorCode := WSAGetLastError; if (ErrorCode <> WSAEWOULDBLOCK) then begin Error(Self, eeSend, ErrorCode); Disconnect(FSocket); if ErrorCode <> 0 then raise ESocketError.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(ErrorCode), ErrorCode, ''''send'''']); end; end; finally Unlock; end; end;
procedure TCustomWinSocket.SetAsyncStyles(Value: TASyncStyles); begin if Value <> FASyncStyles then begin FASyncStyles := Value; if FSocket <> INVALID_SOCKET then DoSetAsyncStyles; end; end;
procedure TCustomWinSocket.Read(Socket: TSocket); begin if (FSocket = INVALID_SOCKET) or (Socket <> FSocket) then Exit; Event(Self, seRead); end;
function TCustomWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer; var ErrorCode: Integer; begin Lock; try Result := 0; if (Count = -1) and FConnected then ioctlsocket(FSocket, FIONREAD, Longint(Result)) else begin if not FConnected then Exit; Result := recv(FSocket, Buf, Count, 0); if Result = SOCKET_ERROR then begin ErrorCode := WSAGetLastError; if ErrorCode <> WSAEWOULDBLOCK then begin Error(Self, eeReceive, ErrorCode); Disconnect(FSocket); if ErrorCode <> 0 then raise ESocketError.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(ErrorCode), ErrorCode, ''''recv'''']); end; end; end; finally Unlock; end; end;
function TCustomWinSocket.ReceiveLength: Integer; begin Result := ReceiveBuf(Pointer(nil)^, -1); end;
function TCustomWinSocket.ReceiveText: string; begin SetLength(Result, ReceiveBuf(Pointer(nil)^, -1)); SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result))); end;
procedure TCustomWinSocket.WndProc(var Message: TMessage); begin try Dispatch(Message); except Application.HandleException(Self); end; end;
procedure TCustomWinSocket.Write(Socket: TSocket); begin if (FSocket = INVALID_SOCKET) or (Socket <> FSocket) then Exit; end;
procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete); begin if Message.LookupHandle = FLookupHandle then begin FLookupHandle := 0; if Message.AsyncError <> 0 then begin Disconnect(FSocket); raise ESocketError.CreateResFmt(@sWindowsSocketError, [SysErrorMessage(Message.AsyncError), Message.ASyncError, ''''ASync Lookup'''']); end; if FLookupState = lsLookupAddress then begin FAddr.sin_addr.S_addr := Integer(Pointer(PHostEnt(FGetHostData).h_addr^)^); ASyncInitSocket('''''''', '''''''', FService, FPort, FQueueSize, FClient); end else if FLookupState = lsLookupService then begin FAddr.sin_port := PServEnt(FGetHostData).s_port; FPort := 0; FService := ''''''''; ASyncInitSocket('''''''', '''''''', '''''''', 0, FQueueSize, FClient); end; end; end;
{ TClientWinSocket }
procedure TClientWinSocket.Connect(Socket: TSocket); begin FConnected := True; Event(Self, seConnect); end;
procedure TClientWinSocket.SetClientType(Value: TClientType); begin if Value <> FClientType then if not FConnected then begin FClientType := Value; ASyncStyles := [asRead, asWrite, asConnect, asClose]; end else raise ESocketError.CreateRes(@sCantChangeWhileActive); end;
{ TServerClientWinsocket }
constructor TServerClientWinSocket.Create(Socket: TSocket; ServerWinSocket: TServerWinSocket); begin FServerWinSocket := ServerWinSocket; if Assigned(FServerWinSocket) then begin FServerWinSocket.AddClient(Self); if FServerWinSocket.AsyncStyles <> [] then begin OnSocketEvent := FServerWinSocket.ClientEvent; OnErrorEvent := FServerWinSocket.ClientError; end; end; inherited Create(Socket); if FServerWinSocket.ASyncStyles <> [] then DoSetAsyncStyles; if FConnected then Event(Self, seConnect); end;
destructor TServerClientWinSocket.Destroy; begin if Assigned(FServerWinSocket) then FServerWinSocket.RemoveClient(Self); inherited Destroy; end;
{ TServerWinSocket }
constructor TServerWinSocket.Create(ASocket: TSocket); begin FConnections := TList.Create; FListLock := TCriticalSection.Create; inherited Create(ASocket); FAsyncStyles := [asAccept]; end;
destructor TServerWinSocket.Destroy; begin inherited Destroy; FConnections.Free; FListLock.Free; end;
procedure TServerWi 上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 [Sql Server]改进的ASP备份SQL Server数据库
|