Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Server-Erkennung im LAN durch Listening-Port (Inno Setup)

Um zu überprüfen, ob ein Server an einem Port lauscht, können Sie Winsock OLE-Steuerung :

type
  TSocketState =
    (sckClosed, sckOpen, sckListening, sckConnectionPending, sckResolvingHost,
     sckHostResolved, sckConnecting, sckConnected, sckClosing, sckError);

type
  TMsg = record
    hwnd: HWND;
    message: UINT;
    wParam: Longint;
    lParam: Longint;
    time: DWORD;
    pt: TPoint;
  end;

const
  PM_REMOVE = 1;

function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax,
  wRemoveMsg: UINT): BOOL; external '[email protected] stdcall';
function TranslateMessage(const lpMsg: TMsg): BOOL;
  external '[email protected] stdcall';
function DispatchMessage(const lpMsg: TMsg): Longint;
  external '[email protected] stdcall';

procedure AppProcessMessage;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;

function CheckPort(Host: string; Port: Integer): Boolean;
var
  Socket: Variant;
begin
  Socket := CreateOleObject('MSWinsock.Winsock');
  Socket.RemoteHost := Host;
  Socket.RemotePort := Port;
  Socket.Connect;

  { Winsock requires message pumping }
  while not (Socket.State in [sckConnected, sckError]) do 
  begin
    AppProcessMessage;
  end;

  Result := (Socket.State = sckConnected);

  if Result then
  begin
    Log(Format('Port %d on %s is open', [Port, Host]));
  end
    else
  begin
    Log(Format('Port %d on %s is NOT open', [Port, Host]));
  end;
  Socket.Close;
end;

Beachten Sie, dass Winsock Die Steuerung erfordert das Pumpen der Nachrichtenwarteschlange. Daher müssen Sie möglicherweise den Assistenten deaktivieren, bevor Sie die Prüfung ausführen, um zu verhindern, dass Benutzer mit dem Formular herumspielen.

Credits:Die AppProcessMessage kommt von Wie führe ich 7zip aus, ohne die InnoSetup-Benutzeroberfläche zu blockieren?