Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-05-2008
yo_coco_py yo_coco_py is offline
Registrado
 
Registrado: may 2005
Posts: 8
Poder: 0
yo_coco_py Va por buen camino
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

Última edición por yo_coco_py fecha: 21-05-2008 a las 19:10:16.
Responder Con Cita
  #2  
Antiguo 22-05-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como arrancar o parara un servicio en funcion de otro servicio ?? QuarkBcn API de Windows 12 15-06-2011 14:46:11
¿como se utiliza un ClientDataSet? Nelly Varios 5 06-06-2006 08:51:01
cambiar el puerto del servicio SMTP de Qmail!! fer21unmsm Linux 0 11-02-2006 05:36:34
Como se utiliza TIni? Drake C++ Builder 1 15-01-2006 15:37:18
Obtener la ruta de un servicio xcostey Varios 2 16-04-2004 00:44:13


La franja horaria es GMT +2. Ahora son las 02:18:45.


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
Copyright 1996-2007 Club Delphi