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 '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;
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?