Как проверить, доступен ли порт TCP с Delphi?

Существует ли более изящный способ проверить, доступен ли порт TCP с Delphi кроме ловли вызова netstat?

5
задан Mattl 28 January 2010 в 16:37
поделиться

4 ответа

Я думаю, вы можете использовать компоненты Indy для этого. Например, TIDHTTPSERVER повысит исключение, если используется порт, когда он открывается.

Так что в основном вы можете создать такой компонент, связывают его с localhost: и если исключение поднимается (поймать его и проверьте его), то порт, вероятно, используется, иначе это бесплатно Отказ

Я думаю, что другие индиковые компоненты могут сказать, если порт открыт или нет, но я не могу посмотреть на это прямо сейчас.

Это было просто, чтобы дать вам подход.

8
ответ дан 18 December 2019 в 07:09
поделиться

@mattl, если доступно, значит откройте для вас, вы можете использовать этот код.

program CheckTCP_PortOpen;

{$APPTYPE CONSOLE}

uses
  Winsock; //Windows Sockets API Unit

    function PortTCPIsOpen(dwPort : Word; ipAddressStr:string) : boolean;
    var
      client : sockaddr_in;//sockaddr_in is used by Windows Sockets to specify a local or remote endpoint address
      sock   : Integer;
    begin
        client.sin_family      := AF_INET;
        client.sin_port        := htons(dwPort);//htons converts a u_short from host to TCP/IP network byte order.
        client.sin_addr.s_addr := inet_addr(PChar(ipAddressStr)); //the inet_addr function converts a string containing an IPv4 dotted-decimal address into a proper address for the IN_ADDR structure.
        sock  :=socket(AF_INET, SOCK_STREAM, 0);//The socket function creates a socket 
        Result:=connect(sock,client,SizeOf(client))=0;//establishes a connection to a specified socket.
    end;

var
  ret    : Integer;
  wsdata : WSAData;
begin
  Writeln('Init WinSock');
  ret := WSAStartup($0002, wsdata);//initiates use of the Winsock
  if ret<>0 then exit;
  try
    Writeln('Description : '+wsData.szDescription);
    Writeln('Status      : '+wsData.szSystemStatus);

    if PortTCPIsOpen(80,'127.0.0.1') then
    Writeln('Open')
    else
    Writeln('Close');

  finally
  WSACleanup; //terminates use of the Winsock
  end;

  Readln;
end.
6
ответ дан 18 December 2019 в 07:09
поделиться

Следующий код из Synapse работает очень хорошо:

uses
  blcksock;

function PortAvailable(Port:STring):boolean;
var
  svr : TTCPBlockSocket;
begin
  svr := TTCPBlockSocket.Create;
  try
    svr.Bind('0.0.0.0',Port);
    svr.Listen;
    result := svr.LastError = 0;
    Svr.CloseSocket;
  finally
    svr.Free;
  end;
end;
4
ответ дан 18 December 2019 в 07:09
поделиться

netstat информацию можно получить, вызвав функции GetTcpTable и GetUdpTable в IP Helper API, или IPHLPAPI.DLL. Для получения дополнительной информации о вызове IPHLPAPI.DLL из Delphi обратитесь к этому Монитору сетевого трафика. Для него также имеется несколько оберток, и он является частью библиотеки JEDI API.

Я уже давно написал Delphi-версию NetStat, но с тех пор потерял исходный код. Однако эти ресурсы должны помочь вам начать работу.

4
ответ дан 18 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: