Существует ли более изящный способ проверить, доступен ли порт TCP с Delphi кроме ловли вызова netstat?
Я думаю, вы можете использовать компоненты Indy для этого. Например, TIDHTTPSERVER
повысит исключение, если используется порт, когда он открывается.
Так что в основном вы можете создать такой компонент, связывают его с localhost:
и если исключение поднимается (поймать его и проверьте его), то порт, вероятно, используется, иначе это бесплатно Отказ
Я думаю, что другие индиковые компоненты могут сказать, если порт открыт или нет, но я не могу посмотреть на это прямо сейчас.
Это было просто, чтобы дать вам подход.
@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.
Следующий код из 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;
netstat информацию можно получить, вызвав функции GetTcpTable и GetUdpTable в IP Helper API, или IPHLPAPI.DLL. Для получения дополнительной информации о вызове IPHLPAPI.DLL из Delphi обратитесь к этому Монитору сетевого трафика. Для него также имеется несколько оберток, и он является частью библиотеки JEDI API.
Я уже давно написал Delphi-версию NetStat, но с тех пор потерял исходный код. Однако эти ресурсы должны помочь вам начать работу.