; ErrorCode: Integer; begin if Message.SelectError <> 0 then begin Result := False; ErrorCode := Message.SelectError; case Message.SelectEvent of FD_CONNECT: ErrorEvent := eeConnect; FD_CLOSE: ErrorEvent := eeDisconnect; FD_READ: ErrorEvent := eeReceive; FD_WRITE: ErrorEvent := eeSend; FD_ACCEPT: ErrorEvent := eeAccept; else ErrorEvent := eeGeneral; end; Error(Self, ErrorEvent, ErrorCode); if ErrorCode <> 0 then raise ESocketError.CreateResFmt(@sASyncSocketError, [ErrorCode]); end else Result := True; end;
begin with Message do if CheckError then case SelectEvent of FD_CONNECT: Connect(Socket); FD_CLOSE: Disconnect(Socket); FD_READ: Read(Socket); FD_WRITE: Write(Socket); FD_ACCEPT: Accept(Socket); end; end;
procedure TCustomWinSocket.CMDeferFree(var Message); begin Free; end;
procedure TCustomWinSocket.DeferFree; begin if FHandle <> 0 then PostMessage(FHandle, CM_DEFERFREE, 0, 0); end;
procedure TCustomWinSocket.DoSetAsyncStyles; var Msg: Integer; Wnd: HWnd; Blocking: Longint; begin Msg := 0; Wnd := 0; if FAsyncStyles <> [] then begin Msg := CM_SOCKETMESSAGE; Wnd := Handle; end; WSAAsyncSelect(FSocket, Wnd, Msg, Longint(Byte(FAsyncStyles))); if FASyncStyles = [] then begin Blocking := 0; ioctlsocket(FSocket, FIONBIO, Blocking); end; end;
procedure TCustomWinSocket.DoListen(QueueSize: Integer); begin CheckSocketResult(bind(FSocket, FAddr, SizeOf(FAddr)), ''''bind''''); DoSetASyncStyles; if QueueSize > SOMAXCONN then QueueSize := SOMAXCONN; Event(Self, seListen); CheckSocketResult(Winsock.listen(FSocket, QueueSize), ''''listen''''); FLookupState := lsIdle; FConnected := True; end;
procedure TCustomWinSocket.DoOpen; begin DoSetASyncStyles; Event(Self, seConnecting); CheckSocketResult(WinSock.connect(FSocket, FAddr, SizeOf(FAddr)), ''''connect''''); FLookupState := lsIdle; if not (asConnect in FAsyncStyles) then begin FConnected := FSocket <> INVALID_SOCKET; Event(Self, seConnect); end; end;
function TCustomWinSocket.GetHandle: HWnd; begin if FHandle = 0 then FHandle := AllocateHwnd(WndProc); Result := FHandle; end;
function TCustomWinSocket.GetLocalAddress: string; var SockAddrIn: TSockAddrIn; Size: Integer; begin Lock; try Result := ''''''''; if FSocket = INVALID_SOCKET then Exit; Size := SizeOf(SockAddrIn); if getsockname(FSocket, SockAddrIn, Size) = 0 then Result := inet_ntoa(SockAddrIn.sin_addr); finally Unlock; end; end;
function TCustomWinSocket.GetLocalHost: string; var LocalName: array[0..255] of Char; begin Lock; try Result := ''''''''; if FSocket = INVALID_SOCKET then Exit; if gethostname(LocalName, SizeOf(LocalName)) = 0 then Result := LocalName; finally Unlock; end; end;
function TCustomWinSocket.GetLocalPort: Integer; var SockAddrIn: TSockAddrIn; Size: Integer; begin Lock; try Result := -1; if FSocket = INVALID_SOCKET then Exit; Size := SizeOf(SockAddrIn); if getsockname(FSocket, SockAddrIn, Size) = 0 then Result := ntohs(SockAddrIn.sin_port); finally Unlock; end; end;
function TCustomWinSocket.GetRemoteHost: string; var SockAddrIn: TSockAddrIn; Size: Integer; HostEnt: PHostEnt; begin Lock; try Result := ''''''''; if not FConnected then Exit; Size := SizeOf(SockAddrIn); CheckSocketResult(getpeername(FSocket, SockAddrIn, Size), ''''getpeername''''); HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.s_addr, 4, PF_INET); if HostEnt <> nil then Result := HostEnt.h_name; finally Unlock; end; end;
function TCustomWinSocket.GetRemoteAddress: string; var SockAddrIn: TSockAddrIn; Size: Integer; begin Lock; try Result := ''''''''; if not FConnected then Exit; Size := SizeOf(SockAddrIn); CheckSocketResult(getpeername(FSocket, SockAddrIn, Size), ''''getpeername''''); Result := inet_ntoa(SockAddrIn.sin_addr); finally Unlock; end; end;
function TCustomWinSocket.GetRemotePort: Integer; var SockAddrIn: TSockAddrIn; Size: Integer; begin Lock; try Result := 0; if not FConnected then Exit; Size := SizeOf(SockAddrIn); CheckSocketResult(getpeername(FSocket, SockAddrIn, Size), ''''getpeername''''); Result := ntohs(SockAddrIn.sin_port); finally Unlock; end; end;
function TCustomWinSocket.GetRemoteAddr: TSockAddrIn; var Size: Integer; begin Lock; try FillChar(Result, SizeOf(Result), 0); if not FConnected then Exit; Size := SizeOf(Result); if getpeername(FSocket, Result, Size) <> 0 then FillChar(Result, SizeOf(Result), 0); finally Unlock; end; end;
function TCustomWinSocket.LookupName(const Name: string): TInAddr; var HostEnt: PHostEnt; InAddr: TInAddr; begin HostEnt := gethostbyname(PChar(Name)); FillChar(InAddr, SizeOf(InAddr), 0); if HostEnt <> nil then begin with InAddr, HostEnt^ do begin S_un_b.s_b1 := h_addr^[0]; S_un_b.s_b2 := h_addr^[1]; S_un_b.s_b3 := h_addr^[2]; S_un_b.s_b4 := h_addr^[3]; end; end; Result := InAddr; end;
function TCustomWinSocket.LookupService(const Service: string): Integer; var ServEnt: PServEnt; begin ServEnt := getservbyname(PChar(Service), ''''tcp''''); if ServEnt <> nil then Result := ntohs(ServEnt.s_port) else Result := 0; end;
function TCustomWinSocket.InitSocket(const Name, Address, Service: string; Port: Word; Client: Boolean): TSockAddrIn; begin Result.sin_family := PF_INET; if Name <> '''''''' then Result.sin_addr := LookupName(name) else if Address <> '''''''' then Result.sin_addr.s_addr := inet_addr(PChar(Address)) else if not Client then Result.sin_addr.s_addr := INADDR_ANY else raise ESocketError.CreateRes(@sNoAddress); if Service <> '''''''' then Result.sin_port := htons(LookupService(Service)) else Result.sin_port := htons(Port); end;
procedure TCustomWinSocket.Listen(const Name, Address, Service: string; Port: Word; QueueSize: Integer; Block: Boolean); begin if FConnected then raise ESocketError.CreateRes(@sCannotListenOnOpen); 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, False); DoListen(QueueSize); end else 上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 [Sql Server]改进的ASP备份SQL Server数据库
|