Как получить результат команды netstat

Я попытался получить список открытых портов на моем ПК в коде c ++. Итак, я хочу использовать команду DOS netstat, Я написал эту строку system("netstat -a") но я не могу получить результат, который он возвращает.

1

Решение

Вы можете начать с этим кодом

int main() {
char buf[10000];
FILE *p = _popen("netstat -a", "r");
std::string s;
for (size_t count; (count = fread(buf, 1, sizeof(buf), p));)
s += string(buf, buf + count);
cout<<s<<endl;
_pclose(p);
}
4

Другие решения

Вы могли бы использовать FILE *results = _popen("netstat -a"); а затем прочитать результаты results как вы бы из файла (например, с fread, fgets, так далее.)

В качестве альтернативы, вы можете использовать GetTcpTable чтобы получить данные вам нужно более напрямую. Вот достаточно полный пример получения большинства тех же данных, что и netstat -a будут:

#include <windows.h>
#include <iphlpapi.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

#define addr_size (3 + 3*4 + 1)   // xxx.xxx.xxx.xxx\0

char const *dotted(DWORD input) {
char output[addr_size];

sprintf(output, "%d.%d.%d.%d",
input>>24,
(input>>16) & 0xff,
(input>>8)&0xff,
input & 0xff);
return strdup(output);
}

int main() {
MIB_TCPTABLE *tcp_stats;
MIB_UDPTABLE *udp_stats;
DWORD size = 0;
unsigned i;
char const *s1, *s2;

GetTcpTable(tcp_stats, &size, TRUE);
tcp_stats = (MIB_TCPTABLE *)malloc(size);
GetTcpTable(tcp_stats, &size, TRUE);

for (i=0; i<tcp_stats->dwNumEntries; ++i) {
printf("TCP:\t%s:%d\t%s:%d\n",
s1=dotted(ntohl(tcp_stats->table[i].dwLocalAddr)),
ntohs(tcp_stats->table[i].dwLocalPort),
s2=dotted(ntohl(tcp_stats->table[i].dwRemoteAddr)),
ntohs(tcp_stats->table[i].dwRemotePort));
free((char *)s1);
free((char *)s2);
}
free(tcp_stats);

return 0;
}

Обратите внимание, что я написал это давным-давно — это гораздо больше C, чем C ++. Если бы я писал это сегодня, я уверен, что сделал бы немало вещей, по крайней мере, немного по-другому.

3

По вопросам рекламы [email protected]