使用Delphi - Telnet样式检查远程端口访问

时间:2014-06-19 09:07:02

标签: delphi telnet indy

我在严重受防火墙影响的环境中部署我的应用程序。我经常发现自己使用Telnet检查端口是否在网络中是开放的和可访问的。 现在我想在Delphi中实现命令Telnet [domainname or ip] [port]的等效功能。

  1. 我只是尝试打开和关闭TCP / IP套接字而不发送或接收任何数据是否足够?
  2. 是否有任何风险可能会导致另一端的任意应用程序/服务崩溃?
  3. 这是我的代码:

    function IsPortActive(AHost : string; APort : Word):boolean;
    var IdTCPClient : TIdTCPClient;
    begin
      IdTCPClient := TIdTCPClient.Create(nil);
      try
        try
          IdTCPClient.Host := AHost;
          IdTCPClient.Port := APort;
          IdTCPClient.Connect;
    
        except
          //Igonre exceptions
        end;
    
      finally
        result := IdTCPClient.Connected;
        IdTCPClient.Disconnect;
        FreeAndNil(IdTCPClient);
      end;
    end;
    

1 个答案:

答案 0 :(得分:2)

如果您只是想检查端口是否打开,那么您可以使用:

function IsPortActive(AHost : string; APort : Word): boolean;
var
  IdTCPClient : TIdTCPClient;
begin
  Result := False;
  try
    IdTCPClient := TIdTCPClient.Create(nil);
    try
      IdTCPClient.Host := AHost;
      IdTCPClient.Port := APort;
      IdTCPClient.Connect;
      Result := True;
    finally
      IdTCPClient.Free;
    end;
  except
    //Ignore exceptions
  end;
end;

但这只会告诉您任何服务器应用是否已打开端口。如果您想确保您的服务器应用程序打开了端口,那么您必须实际与服务器通信并确保其响应符合您的预期。因此,许多常见的服务器协议提供初始问候语,因此客户端可以识别它们所连接的服务器类型。如果您可以自由更改通信协议,可以考虑向服务器添加类似的问候语。

只需打开与服务器的连接不会造成服务器崩溃的任何风险,它所做的只是暂时占用服务器客户端列表中的一个插槽。但是,如果您实际将数据发送到服务器,并且您连接的服务器应用程序不是您的应用程序,那么如果服务器无法处理不符合它的任意数据,您确实会运行风险它的预期协议。但这种情况非常罕见。发送一个小命令并不常见,通常非常安全,你要么得到回复(可能是一种不符合你的协议的格式,所以只是假设失败),或者你可能根本没有得到任何答复(就像服务器正在等待更多数据,或者只是设计不返回一个回复),在这种情况下你可以简单地超时读取并假设失败。