Резултати от 1 до 5 от общо 5

Delphi :: Проверка дали даден порт е зает

Сподели във Facebook Сподели в Twitter Изпрати на Email Сподели в LinkedIn
  1. Junior Member
    Тук е от
    Oct 2004
    Мнения
    24
    #1

    Delphi :: Проверка дали даден порт е зает

    Здравейте!
    Как да проверя дали даден мрежов порт на компютъра е зает, например заради някой уеб сървър или сокет сървър?

    Проблемът идва от там, че използвам Indy HTTP server, който дава неуправляема грешка когато потрът е зает при опит за активацията му. Тя не се поддава даже и на try/except.

    Така че ако има начин, преди да отворя сървъра, да проверя дали портът е свободен, ще бъде идеално.

    Благодаря предварително!

  2.  
     
  3. Senior Member
    Тук е от
    Oct 2004
    Мнения
    1,378
    #2

    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/
    Успех!

  4. SAGE
    Guest
    #3

    Re: Delphi :: Проверка дали даден порт е зает

    Погледна ли това:
    http://forum.vingrad.ru/index.php?showtopic=9935*

    Може да видиш и този сорс на Delphi:
    http://assarbad.info/stuff/portscan.zip

    //Edit:
    Първия линк май няма да ти свърши работа, но примера от втория линк ти сканира всички портове и показва кои са заети(Open).

  5. C#
    C# е офлайн
    Novice
    Тук е от
    Mar 2006
    Мнения
    1
    #4

    Re: Delphi :: Проверка дали даден порт е зает

    опитай се да го отвориш, но загради кода в try / catch блок (в Delphi май беше try / except)
    ако влезеш в except блока, значи порта е вече отворен*

  6. Junior Member
    Тук е от
    Mar 2006
    Мнения
    134
    #5

    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.


Сподели във Facebook Сподели в Google Plus Сподели в Twitter Изпрати на Email Сподели в LinkedIn

Подобни теми

  1. Отговори: 11
    Последно: 12-07-06, 02:02
  2. Дали пък някой не иска проверка на IBAN?
    От Daddy във форум Общ - софтуер
    Отговори: 2
    Последно: 09-05-06, 20:35
  3. Отговори: 3
    Последно: 25-04-06, 21:10

SetCombG.com
SetCombG.com е портален сайт и Форум за битова техника, телевизори, климатици, лаптопи и смартфони, създаден през 1999 година.
Заедно сме над 20 години!
Следвай ни
Горе