Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/09/2013, 12:59
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: Obtener puertos abiertos TCP/IP por cada programa

Pongo una miniaplicacion que seguramente te solucionará muchas de las dudas:

Código C:
Ver original
  1. int main() {
  2.     MIB_TCPTABLE_OWNER_PID *tcp_table;
  3.     MIB_TCPROW_OWNER_PID *proc_owner;
  4.     unsigned long dw;
  5.     HANDLE hproc;
  6.     char base_name[512];
  7.     unsigned char ipv4_address[4] = {0,0,0,0};
  8.     int q;
  9.  
  10.     //determinas tamaño de la struct MIB_TCPTABLE_OWNER_PID y reserva memoria
  11.     GetExtendedTcpTable(0, &dw, 0, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
  12.     tcp_table = (MIB_TCPTABLE_OWNER_PID*)malloc(dw);
  13.  
  14.     //consulta las tablas
  15.     GetExtendedTcpTable(tcp_table, &dw, 0, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
  16.    
  17.     //recorre las tablas
  18.     for(dw = 0; dw < tcp_table->dwNumEntries; dw++) {
  19.         proc_owner = &tcp_table->table[dw];
  20.  
  21.         if((hproc = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, 0, proc_owner->dwOwningPid))) {
  22.  
  23.             if(GetModuleBaseName(hproc, 0, base_name, sizeof(base_name))) {
  24.                 printf("%s\n", base_name);
  25.  
  26.                 for(q = 0; q < 4; q++) {
  27.                     ipv4_address[q] = ( proc_owner->dwLocalAddr >> (q*8) ) & 0xFF;
  28.                 }
  29.                 printf("\tLocal\t%d.%d.%d.%d : %d\n", ipv4_address[0], ipv4_address[1], ipv4_address[2], ipv4_address[3], (int)ntohs(proc_owner->dwLocalPort));
  30.  
  31.                 for(q = 0; q < 4; q++) {
  32.                     ipv4_address[q] = ( proc_owner->dwRemoteAddr >> (q*8) ) & 0xFF;
  33.                 }
  34.                 printf("\tRemoto\t%d.%d.%d.%d : %d\n", ipv4_address[0], ipv4_address[1], ipv4_address[2], ipv4_address[3], (int)ntohs(proc_owner->dwRemotePort));
  35.  
  36.                 printf("\tEstado\t%d", proc_owner->dwState);
  37.  
  38.                 printf("\n\n");
  39.             }
  40.             CloseHandle(hproc);
  41.         }
  42.     }
  43.  
  44.     return 0;
  45. }

La funcion GetExtendedTcpTable está en iphlpapi.h, la funcion GetModuleBaseName está en psapi.h, a su vez estas cabeceras incluyen otras cabeceras con tipos de datos definidos en windef.h y no se donde mas por lo que tambien tendras que incluir windows.h Si ademas quieres trabajar con funciones de red cambia windows.h por winsock2.h En este caso lo unico que hago en red es determinar la IP a partir del numero, para eso no hace falta iniciar la libreria de sockets. No olvides linkar las librerias de las cabeceras.

Saludos