Я пытаюсь выяснить, как получить всю сетевую активность для данного процесса. В приложении Windows «Resource Monitor» в поле «Сетевая активность» вы можете видеть все соединения tcp / udp, отправляемые данные и т. Д. Сначала я попытался использовать команду netstat cmd и собирался проанализировать это, но быстро понял, что «пропускает» целую кучу соединений udp. Так что это было вне. Теперь я искал в использовании iphlpapi.h
в C ++ вместе с его GetExtendedUdpTable
функция. Но даже это, кажется, не показывает все данные, которые показывает Resource Monitor. Может кто-нибудь направить меня к надлежащему API Windows, который может получить ту же информацию, что и на вкладке «Сетевая активность» в разделе «Монитор ресурсов». Я долго искал, и все, что я нашел, очень старое, я надеюсь использовать любой современный / современный подход. Это не обязательно должно быть обратно совместимо, хорошо только для windows 10.
По сути, моей конечной целью является создание приложения, которое может автоматически определять местоположение ip с использованием базы данных для целевого приложения (включая соединения UDP). Теперь я уверен, что есть много библиотек / приложений, которые уже могут это сделать. Я просто хочу сделать это как учебный процесс, поэтому я хотел бы избегать любых библиотек / API, кроме предоставляемых Windows.
Это то, с чем я сейчас работаю, пожалуйста, прости использование плохих практик, таких как использование printf
и не используя static_cast
и т.д. Я буду переписывать все правильно, как только найду способ получения информации, которую я ищу.
MIB_UDPTABLE_OWNER_PID* pUdpTable;
MIB_UDPROW_OWNER_PID* owner;
DWORD dwSize;
DWORD dwResult;
dwResult = GetExtendedUdpTable(NULL, &dwSize, false, AF_INET, UDP_TABLE_OWNER_PID, 0);
pUdpTable = (MIB_UDPTABLE_OWNER_PID*)MALLOC(dwSize);
dwResult = GetExtendedUdpTable(pUdpTable, &dwSize, false, AF_INET, UDP_TABLE_OWNER_PID, 0);
for (DWORD dwLoop = 0; dwLoop < pUdpTable->dwNumEntries; dwLoop++) {
owner = &pUdpTable->table[dwLoop];
printf("%ld ", owner->dwOwningPid);
HANDLE Handle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
owner->dwOwningPid
);
if (Handle) {
TCHAR Buffer[MAX_PATH];
if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
printf(Buffer);
printf("\n");
} else {
printf("Error GetModuleFileNameEx : %lu\n", GetLastError());
}
CloseHandle(Handle);
} else {
printf("Error OpenProcess : %lu\n", GetLastError());
}
}
FREE(pUdpTable);
Задача ещё не решена.
Других решений пока нет …