Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Como Obtener el puerto que utiliza de un servicio (https://www.clubdelphi.com/foros/showthread.php?t=56597)

yo_coco_py 21-05-2008 19:04:23

Como Obtener el puerto que utiliza de un servicio
 
Hola a todos...
El tema es el siguiente: necesito saber como obtener el puerto que esta utilizando en servicio de windows, es algo asi como: http=puerto 80, snmp=puerto 161, pop3= puerto 110, etc..
Bueno.., el obtener todos los servicios de windows, esten estos corriendo o no, ya lo hice, ahora la gran incognita que tengo es: existe alguna funcion o algo asi para obtener el puerto que esta utilizando el servicio, buscando por el nombre..? Me imagino algo asi como getportbyname..., si existe y alguien me puede dar alguna informacion sobre ello, eternamente agradecido... :)
Aclaracion: con S.O. Windows XP y en Delphi 7

cHackAll 22-05-2008 15:09:32

Si el servicio no está corriendo, solo puedes obtener sus dependencias; lo que dificilmente te dirá qué puertos utiliza con exactitud. Si está corriendo entonces podrás obtener la informacion de los puertos que hace uso; ésto lo obtendrás por PID, por lo cual he creado la función GetUsedPortsByPID con lo cual podrás cumplir tu misión.

La principal diferencia entre un puerto TCP y uno UDP será la dirección remota, por ello si Info[Index].Addr = 0 entonces es un puerto UDP.

Nota; aconsejo revisar unidad TlHelp32;

Código Delphi [-]
type
 TGetTable = function(lpTable: Pointer; lpSize: PCardinal; bOrder: LongBool; sin_family, TableClass, Reserved: Cardinal): Cardinal; stdcall;
 TInfo = array [0..255] of packed record
  Addr, Port: Cardinal;
 end;

procedure _Add(var Info: TInfo; var Result: Cardinal; _GetTable: TGetTable; _class, pid, _pid, _port, _addr, _size: Cardinal; _tcp: Boolean);
var
 Table, Actually: PCardinal;
 Size, Count, Port: Cardinal;
begin
 Size := 0;
 if _GetTable(nil, @Size, True, 2{AF_INET}, _class, 0) = ERROR_INSUFFICIENT_BUFFER then
  begin
   Table := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
   _GetTable(Table, @Size, True, 2{AF_INET}, _class, 0);
   Count := Table^;
   Actually := PCardinal(Cardinal(Table) + 4);
   while LongBool(Count) do
    begin
     if PCardinal(Cardinal(Actually) + _pid)^ = pid then
      begin
       Port := PCardinal(Cardinal(Actually) + _port)^;
       if not _tcp then
        Info[Result].Addr := 0
       else
        Info[Result].Addr := PCardinal(Cardinal(Actually) + 12)^;
       Info[Result].Port := (Port div 256) + (Port mod 256) * 256;
       Inc(Result);
      end;
     Inc(Actually, _size);
     Dec(Count);
    end;
   VirtualFree(Table, 0, MEM_RELEASE);
  end;
end;

function GetUsedPortsByPID(dwProcessID: Cardinal; var Info: TInfo): Cardinal;
var hModule: Cardinal;
begin
 Result := 0;
 hModule := LoadLibrary('iphlpapi');
 _Add(Info, Result, GetProcAddress(hModule, 'GetExtendedTcpTable'), 5{TCP_TABLE_OWNER_PID_ALL}, dwProcessID, 20, 8, 4, 6, True);
 _Add(Info, Result, GetProcAddress(hModule, 'GetExtendedUdpTable'), 1{UDP_TABLE_OWNER_PID}, dwProcessID, 8, 4, 0, 3, False);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Info: TInfo;
 Index: Cardinal;
begin
 for Index := 1 to GetUsedPortsByPID(1256, Info) do
  ShowMessage(IntToStr(Info[Index - 1].Port));
end;

Saludos


La franja horaria es GMT +2. Ahora son las 04:19:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi