Pongo una miniaplicacion que seguramente te solucionará muchas de las dudas:
Código C:
Ver originalint main() {
MIB_TCPTABLE_OWNER_PID *tcp_table;
MIB_TCPROW_OWNER_PID *proc_owner;
unsigned long dw;
HANDLE hproc;
char base_name[512];
unsigned char ipv4_address[4] = {0,0,0,0};
int q;
//determinas tamaño de la struct MIB_TCPTABLE_OWNER_PID y reserva memoria
GetExtendedTcpTable(0, &dw, 0, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
tcp_table
= (MIB_TCPTABLE_OWNER_PID
*)malloc(dw
);
//consulta las tablas
GetExtendedTcpTable(tcp_table, &dw, 0, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
//recorre las tablas
for(dw = 0; dw < tcp_table->dwNumEntries; dw++) {
proc_owner = &tcp_table->table[dw];
if((hproc = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, 0, proc_owner->dwOwningPid))) {
if(GetModuleBaseName(hproc, 0, base_name, sizeof(base_name))) {
for(q = 0; q < 4; q++) {
ipv4_address[q] = ( proc_owner->dwLocalAddr >> (q*8) ) & 0xFF;
}
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
));
for(q = 0; q < 4; q++) {
ipv4_address[q] = ( proc_owner->dwRemoteAddr >> (q*8) ) & 0xFF;
}
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
));
printf("\tEstado\t%d", proc_owner
->dwState
);
}
CloseHandle(hproc);
}
}
return 0;
}
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