Per verificare se un server è in ascolto su una porta, puoi utilizzare Winsock Controllo 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 'example@sqldat.com stdcall';
function TranslateMessage(const lpMsg: TMsg): BOOL;
external 'example@sqldat.com stdcall';
function DispatchMessage(const lpMsg: TMsg): Longint;
external 'example@sqldat.com 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;
Nota che il Winsock il controllo richiede il pompaggio della coda dei messaggi. Quindi potrebbe essere necessario disabilitare la procedura guidata prima di eseguire il controllo, per impedire all'utente di incasinare il modulo.
Crediti:AppProcessMessage proviene da Come eseguire 7zip senza bloccare l'interfaccia utente di InnoSetup?