sql >> Base de Datos >  >> RDS >> Mysql

Detección de servidor MySQL en LAN mediante puerto de escucha (Inno Setup)

Para verificar si un servidor está escuchando en un puerto, puede usar Winsock Control OLE :

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;

Tenga en cuenta que Winsock el control requiere el bombeo de la cola de mensajes. Por lo tanto, es posible que deba deshabilitar el asistente antes de ejecutar la verificación, para evitar que el usuario altere el formulario.

Créditos:El AppProcessMessage proviene de ¿Cómo ejecutar 7zip sin bloquear la interfaz de usuario de InnoSetup?