2010-01-28 3 views

답변

4

나는 Indy의 구성 요소를 사용하여 그렇게 할 수 있다고 생각합니다. 예를 들어 TIdHTTPServer은 포트가 열려있을 때 사용 중이면 예외를 발생시킵니다.

기본적으로 그러한 구성 요소를 만들고 localhost:<yourport>에 바인딩 할 수 있으며 예외가 발생하면 (잡아서 확인하십시오) 포트가 사용 중이며 그렇지 않은 경우 사용 가능합니다.

나는 다른 indy 구성 요소가 포트가 열려 있는지 여부를 알 수 있지만 지금은 볼 수 없다고 생각합니다.

이것은 접근 방법을 제공하기위한 것입니다.

6

@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

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; 
2

netstat 정보는 IP 도우미 API, 또는 IPHLPAPI.DLL에서 GetTcpTableGetUdpTable 함수를 호출하여 검색 할 수 있습니다. Delphi에서 IPHLPAPI.DLL을 호출하는 방법에 대한 자세한 내용은 Network traffic monitor을 확인하십시오. 그것에 대해서도 wrappers가 있으며, 이는 JEDI API Library의 일부입니다.

필자는 오래 전 NetStat의 Delphi 버전을 작성했지만 소스 코드를 잃어 버렸습니다. 그 자원은 당신을 시작할 수 있어야합니다.

관련 문제