| |||
Obtener puertos abiertos TCP/IP por cada programa Hola quiero hacer una pequeña aplicación en C++ a nivel de consola que me permita ver las pilas TCP/IP de todos los puertos abiertos de todos los programas que se ejecutan en mi computadora algo parecido al comando netstat pero a diferencia que saber que programa esta usando cada puerto; alguien sabe si existe alguna librería que pueda usar o donde puedo obtener documentación para elaborar mi pequeña aplicación. Última edición por EL_DOC; 29/08/2013 a las 08:14 |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Buscando en la red encontré un código de alguien que está haciendo casi lo mismo pero hay ciertas cosas que no logro comprender del código si alguien me ayuda a comprender el código se los agradecería, el código es el siguiente: string Port::GetListOfTcpPorts() { string ApplicationName = ""; string result = ""; string aux = ""; string RemotePort = ""; DWORD (WINAPI *pGetExtendedTcpTable)( PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserved ); MIB_TCPTABLE_OWNER_PID *pTCPInfo; MIB_TCPROW_OWNER_PID *owner; DWORD size; DWORD dwResult; HMODULE hLib = LoadLibrary("iphlpapi.dll"); pGetExtendedTcpTable = (DWORD (WINAPI *)(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CLASS,ULONG)) GetProcAddress(hLib, "GetExtendedTcpTable"); dwResult = pGetExtendedTcpTable(NULL, &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0); pTCPInfo = (MIB_TCPTABLE_OWNER_PID*)malloc(size); dwResult = pGetExtendedTcpTable(pTCPInfo, &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0); for (DWORD dwLoop = 0; dwLoop < pTCPInfo->dwNumEntries; dwLoop++) { owner = &pTCPInfo->table[dwLoop]; ApplicationName = GetNameByPID(owner->dwOwningPid); OpenedPort = convertInt(ntohs(owner->dwLocalPort)); RemotePort = convertInt(ntohs(owner->dwRemotePort)); aux = "TCP ; " + OpenedPort + ";"+ RemotePort+";"+ ApplicationName + "\n"; result = result + aux; } return result; } |
| |||
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 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 |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Saludos Vosk ya estoy implementando mi función pero tengo un problema y es a la hora de recorrer la tabla que me devuelve GetExtendedTcpTable no se que hice mal en el for si me puedes ayudar te lo agradecería
Código C++:
Ver original pTcpTable no es el parámetro yo declaré la variable con el mismo nombre PVOID pTclTable Última edición por EL_DOC; 05/09/2013 a las 15:24 |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Hola Vosk ya implementé la función GetExtendedTcpTable y comparé los PId que me retorna con los del ProcessExplorer para ver si me retorna todos los procesos y no me muestra todos los procesos que me muestra el processExplorer que son iguales a los procesos que muestra el administrador de windows tal vez puedas ayudarme o si alguien sabe el problema se los agradecería. |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa
Código C:
Ver original Ojo, dwNumEntries en la struct MIB_TCPTABLE_OWNER_PID es DWORD (unsigned long). "...no me muestra todos los procesos..." Consulta los argumentos validos en la referencia de msdn http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx, cambia y/o combina el flag de ulAf y la tabla requerida. En el caso de mi ejemplo que colgué estoy pidiendo los pIDs de todos los procesos abiertos en red y usando el protocolo IPv4. Saludos vosk |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Si gracias, una consulta y si quiero saber el protocolo si es TCP o UDP porque en la estructura de la tabla que devuelve no retorna el protocolo |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Vas a tener que estar un poco mas al tanto con eso :) , pero tranquilo que tiene facil solucion: la funcion GetExtendedTcpTable es (tal como el nombre indica) para tcp, la funcion GetExtendedUdpTable es para udp. En msdn tienes la referencia de ambas. Saludos vosk |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa ahh gracias en otras palabras no incluye en la estructura de la tabla un campo protocol porque lo que me devuelve en el caso de GetExtendedTcpTable son sólo para los de este protocolo y la función GetExtendedUdpTable son para los protocolos udp |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Vosk una pregunta para la función GetExtendedUdpTable no hay un enum para que me devuelva todos las conexiones así como para tcp que está el enum "TCP_TABLE_OWNER_PID_ALL" para conexiones udp estaba revisando la documentación y sólo está "UDP_TABLE_ONER_PID" disculpa las molestias |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa tengo otra consulta, hay algo que no comprendo bien del código que pusiste arriba porque utilizas las funciones OpenProcess y GetModuleName en las siguientes líneas:
Código C++:
Ver original |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa Por lo de las UDP_TABLE_ONER_PID no puedo ayudarte porque solo he usado las tcp, pero tambien le echaré un vistazo a ver si veo algo. La funcion OpenProcess retorna un handler de un proceso activo, acepta tres argumentos: un flag (o una combinacion) de acceso, un boleano que indica si el handler retornado puede ser heredado por procesos derivados del proceso que pide el handler, y el identificador de proceso. En el ejemplo pido un handler con acceso de lectura, no heredable, para el proceso cuyo id se indica en la tabla de procesos. Es la consulta minima segura para obtener un manejador (handler) de proceso (puede que haya otra forma) para consultas simples. El handler me sirve para llamar a cualquier funcion en la que se requiera un manejador con permiso de acceso a informacion (query) y permiso de lectura, por eso necsito los flags PROCESS_QUERY_INFORMATION y PROCESS_VM_READ. Algunas funciones solo requieren el flag de lectura, etc... Los permisos de los handlers que se usan en las funciones estan indicados en la referencia de cada funcion (en el manual de referencia o en msdn). En este caso quiero el nombre base de la instancia de la aplicacion, por eso ejecuta GetModuleBaseName. Esta funcion requiere un handler con permisos (como minimo) de acceso y de lectura (los que pedí en OpenProcess), el segundo argumento es el manipulador del modulo (si indico nulo me retorna el nombre del ejecutable desde el que se creó esa instancia), el tercer argumento es un buffer de texto donde copiará el nombre, y el cuarto indica el tamaño del buffer. Si quieres obtener la ruta absoluta al ejecutable desde el que se creo el proceso de la instancia puedes usar GetModuleFileName, tienes la referencia en msdn).
Código C:
Ver original Saludos vosk |
| |||
Respuesta: Obtener puertos abiertos TCP/IP por cada programa "...estaba revisando la documentación y sólo está "UDP_TABLE_ONER_PID"..." Copio y pego lo que veo en la referencia:
Código C:
Ver original Entiendo que MIB_UDPTABLE_OWNER_PID te va a listar todas las disponibles a causa del funcionamiento del procolo udp: abres para envio, envias y cierras. Saludos vosk |
Etiquetas: |