我在严重受防火墙影响的环境中部署我的应用程序。我经常发现自己使用Telnet检查端口是否在网络中是开放的和可访问的。
现在我想在Delphi中实现命令Telnet [domainname or ip] [port]
的等效功能。
这是我的代码:
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;
答案 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;
但这只会告诉您任何服务器应用是否已打开端口。如果您想确保您的服务器应用程序打开了端口,那么您必须实际与服务器通信并确保其响应符合您的预期。因此,许多常见的服务器协议提供初始问候语,因此客户端可以识别它们所连接的服务器类型。如果您可以自由更改通信协议,可以考虑向服务器添加类似的问候语。
只需打开与服务器的连接不会造成服务器崩溃的任何风险,它所做的只是暂时占用服务器客户端列表中的一个插槽。但是,如果您实际将数据发送到服务器,并且您连接的服务器应用程序不是您的应用程序,那么如果服务器无法处理不符合它的任意数据,您确实会运行小风险它的预期协议。但这种情况非常罕见。发送一个小命令并不常见,通常非常安全,你要么得到回复(可能是一种不符合你的协议的格式,所以只是假设失败),或者你可能根本没有得到任何答复(就像服务器正在等待更多数据,或者只是设计不返回一个回复),在这种情况下你可以简单地超时读取并假设失败。