Delphi :: Проверка дали даден порт е зает
Здравейте!
Как да проверя дали даден мрежов порт на компютъра е зает, например заради някой уеб сървър или сокет сървър?
Проблемът идва от там, че използвам Indy HTTP server, който дава неуправляема грешка когато потрът е зает при опит за активацията му. Тя не се поддава даже и на try/except.
Така че ако има начин, преди да отворя сървъра, да проверя дали портът е свободен, ще бъде идеално.
Благодаря предварително!
Re: Delphi :: Проверка дали даден порт е зает
Ако си под WindowsXP, може да пробваш следното: netsh diag connect iphost адрес_на_хоста номер_на_порт
Например на моята машина съм активирал ftp сървър и без да проверявам в IIS дали е стартиран или не, мога да го направя така:
C:\>netsh diag connect iphost 127.0.0.1 21
IPHost (127.0.0.1)
IPHost = 127.0.0.1
Port = 21
Server appears to be running on port(s) [21]
Разбира се, това е вярно, ако съм указал на сървъра да слуша на адрес 127.0.0.1. А можеш да ползваш и nmap /за Linux (all distributions), Microsoft Windows, Mac OS X, FreeBSD, OpenBSD, NetBSD, Sun Solaris, Аmiga, HP-UX/
Успех! :) :Drinks:
Re: Delphi :: Проверка дали даден порт е зает
Погледна ли това: :grin:
http://forum.vingrad.ru/index.php?showtopic=9935*
Може да видиш и този сорс на Delphi:
http://assarbad.info/stuff/portscan.zip
//Edit:
Първия линк май няма да ти свърши работа, но примера от втория линк ти сканира всички портове и показва кои са заети(Open).
Re: Delphi :: Проверка дали даден порт е зает
опитай се да го отвориш, но загради кода в try / catch блок (в Delphi май беше try / except)
ако влезеш в except блока, значи порта е вече отворен* :016:
Re: Delphi :: Проверка дали даден порт е зает
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
type
EIpHlpError = class(Exception);
PTMibTCPRow = ^TMibTCPRow;
TMibTCPRow = packed record
dwState: DWORD;
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwRemoteAddr: DWORD;
dwRemotePort: DWORD;
end;
PTMibTCPTable = ^TMibTCPTable;
TMibTCPTable = packed record
dwNumEntries: DWORD;
Table: array[0..0] of TMibTCPRow;
end;
function GetTcpTable(pTcpTable: PTMibTCPTable; var pdwSize: DWORD; bOrder: BOOL): DWORD; stdcall;
implementation
uses WinSock;
{$R *.dfm}
resourcestring
sNotImplemented = 'Function %s is not implemented.';
// sInvalidParameter = 'Function %s. Invalid parameter';
// sNoData = 'Function %s. No adapter information exists for the local computer.';
// sNotSupported = 'Function %s is not supported by the operating system.';
const
iphlpapilib = 'iphlpapi.dll';
function GetTcpTable; external iphlpapilib name 'GetTcpTable';
procedure VVGetTcpTable(var pTcpTable: PTMibTCPTable; var dwSize: DWORD; const bOrder: BOOL);
var
Res: DWORD;
begin
pTcpTable := nil;
dwSize := 0;
if @GetTcpTable = nil then
raise EIpHlpError.CreateFmt(sNotImplemented, ['GetTcpTable']);
Res := GetTcpTable(pTcpTable, dwSize, bOrder);
if Res = ERROR_INSUFFICIENT_BUFFER then
begin
Getmem(pTcpTable, dwSize);
FillChar(pTcpTable^, dwSize, #0);
Res := GetTcpTable(pTcpTable, dwSize, bOrder);
end;
if Res <> NO_ERROR then ; // raise error
end;
function IpAddressToString(Addr: DWORD): string;
var
InAddr: TInAddr;
begin
InAddr.S_addr := Addr;
Result := inet_ntoa(InAddr);
end;
function GetTcpPortNumber(aDWord: DWord): Longint;
begin
Result := Trunc(aDWord / 256 + (aDWord mod 256) * 256);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pTcpTable: PTMibTCPTable;
dwSize: DWORD;
i: integer;
begin
VVGetTcpTable(pTcpTable, dwSize, False);
for i := 0 to pTcpTable^.dwNumEntries do
with pTcpTable^.table[i], Memo1.Lines do
Add(Format(' %15s %5d %15s %5d %5d', [IpAddressToString(dwLocalAddr),
GetTcpPortNumber(dwLocalPort), IpAddressToString(dwRemoteAddr),
GetTcpPortNumber(dwRemotePort), dwState]));
end;
end.