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的话, 有的等了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值