代码之家  ›  专栏  ›  技术社区  ›  Mattl

如何检查Delphi是否有可用的TCP端口?

  •  5
  • Mattl  · 技术社区  · 15 年前

    有没有比捕获netstat调用更优雅的方法来检查Delphi是否提供了TCP端口?

    4 回复  |  直到 15 年前
        1
  •  7
  •   zz1433    15 年前

    我想你可以用Indy的组件来实现这一点。例如A TIdHTTPServer 如果端口在打开时正在使用,将引发异常。

    所以基本上你可以创建这样的组件,把它绑定到 localhost:<yourport> 如果引发了异常(捕获并检查它),那么端口可能正在使用,否则它是免费的。

    我想其他的indy组件可以判断一个端口是否打开,但我现在看不到它。

    这只是给你一个方法。

        2
  •  6
  •   RRUZ    15 年前

    @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.
    
        3
  •  4
  •   skamradt    15 年前

    以下代码来自 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
  •  4
  •   Jim McKeeth    15 年前

    netstat 可以通过调用 GetTcpTable GetUdpTable IP帮助程序API或iphlapi.dll中的函数。有关从Delphi调用iphlapi.dll的详细信息,请查看 Network traffic monitor . 有一些 wrappers 因为它也是 JEDI API Library .

    我很久以前就写了一个netstat的delphi版本,但后来丢失了源代码。不过,这些资源应该可以帮助您开始工作。