Je suppose que vous pouvez utiliser Indy composants pour le faire. Par exemple, un TIdHTTPServer va lever une exception si un port est en cours d'utilisation quand il est ouvert.
Donc, fondamentalement, vous pouvez créer un tel composant, le lier à localhost:<yourport> et si une exception est levée ( de l'attraper et de le vérifier ), alors le port est probablement en cours d'utilisation, sinon il est gratuit.
Je suppose que d'autres composants indy peut dire si un port est ouvert ou pas, mais je ne peux pas regarder cela maintenant.
@Mattl, si les moyens Disponibles de l'ouvrir pour vous, vous pouvez utiliser ce code.
program CheckTCP_PortOpen;{$APPTYPE CONSOLE}uses
Winsock;//Windows Sockets API Unitfunction 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<>0then 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.
Je l'ai essayé et Il fonctionne, mais il est beaucoup plus lent que la "liaison d'un port et tester si elle ne parvient pas' approche 🙂
J'ai écrit un Delphi version de la commande NetStat il y a longtemps, mais qui ont depuis perdu le code source. Ces ressources devraient vous aider à démarrer.
Je suppose que vous pouvez utiliser Indy composants pour le faire. Par exemple, un
TIdHTTPServer
va lever une exception si un port est en cours d'utilisation quand il est ouvert.Donc, fondamentalement, vous pouvez créer un tel composant, le lier à
localhost:<yourport>
et si une exception est levée ( de l'attraper et de le vérifier ), alors le port est probablement en cours d'utilisation, sinon il est gratuit.Je suppose que d'autres composants indy peut dire si un port est ouvert ou pas, mais je ne peux pas regarder cela maintenant.
C'était juste pour vous donner une approche.
OriginalL'auteur zz1433
@Mattl, si les moyens Disponibles de l'ouvrir pour vous, vous pouvez utiliser ce code.
OriginalL'auteur RRUZ
Le code suivant à partir Synapse fonctionne très bien:
OriginalL'auteur skamradt
netstat informations peuvent être récupérées par l'appel de la GetTcpTable et GetUdpTable fonctions dans l'API d'assistance IP, ou IPHLPAPI.DLL. Pour plus d'informations sur l'appel de la IPHLPAPI.DLL à partir de Delphi, découvrez cette Network traffic monitor. Il y a quelques les enveloppeurs pour elle aussi, et elle est partie de JEDI Bibliothèque d'API.
J'ai écrit un Delphi version de la commande NetStat il y a longtemps, mais qui ont depuis perdu le code source. Ces ressources devraient vous aider à démarrer.
OriginalL'auteur Jim McKeeth