DELPHI如何檢測指定的端口是否開放

1. 簡單的就是利用Indy的控件, TIdTCPClient. --- Primer說的是, 連的上就是開, 連不上就是關.
一個簡單的例子, (Delphi 7)
代碼:

function ScanTCPPort(ipstr : string; Port : DWORD) : Boolean;
var
  ClientSocket : TIdTCPClient;
begin

  try
    ClientSocket := TIdTCPClient.Create(self);
    try
      ClientSocket.Host := ipstr; //ipstr := '127.0.0.1';
      ClientSocket.Port := Port;
      ClientSocket.Connect;
      ClientSocket.Disconnect; 
     
      //the port is open, and add your code as below.
      //...
     
      Result := True;
    except
      ; //do nothing; --- means the port is not open.
      Result := False;
    end;
  finally
    ClientSocket.Free;
  end;
 
end;

2. Delphi的版本變來變去的, D6的時候用TServerSocket, 但D7就已經不同了. 所以還是用Win32 Socket API比較可靠:
代碼:

function ScanTCPPort(ipstr : string; Port: DWORD): Boolean;
var
  option: DWORD;
  TcpSock: TSocket;
  InAddr: TSockAddrIn;
  IP : DWORD;
begin
  result := False;
 
  //convert IP string to ulong
  IP := ntohl(inet_addr(PChar(ipstr)));
  if IP = INADDR_NONE then  //invalid IP address!
    exit;
 
  // Create/open a socket (stream, not datagram)
  TcpSock := socket(AF_INET, SOCK_STREAM, 0);
  if TcpSock = INVALID_SOCKET then  //socket error
    exit;
   
  try
    // Set socket options
    option := 0;
    setsockopt(TcpSock, SOL_SOCKET, SO_KEEPALIVE, @option, sizeof(option));
    option := 1;
    setsockopt(TcpSock, SOL_SOCKET, SO_DONTLINGER, @option, sizeof(option));
   
    //if winsock 1.1, including the next sentence, otherwise, skip it.
    setsockopt(TcpSock, IPPROTO_TCP, TCP_NODELAY, @option, sizeof(option));
   
    //Initialize address structure
    ZeroMemory(@InAddr, sizeof(InAddr));
    InAddr.sin_family := AF_INET;
    InAddr.sin_addr.S_addr := ntohl(IP);
    InAddr.sin_port := htons(Port);
    //Try to connect
    Result := connect(TcpSock, InAddr, sizeof(InAddr)) = 0;
  finally
    //Close the socket
    closesocket(TcpSock);
  end;
end;

3. 是使用的時候, 最好結合多線程一起使用, 不然如何檢測一個ip的端口範圍從1~65535的話, 有的等了.
發佈了7 篇原創文章 · 獲贊 2 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章