1

私のPCで開いているポートのリストをc++コードで取得しようとしました。それで、DOSコマンドを使用したいと思いますnetstat。この行を書きましたsystem("netstat -a")が、返された結果を取得できません。

4

2 に答える 2

4

このコードで開始できます

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);  
}
于 2013-04-01T13:30:52.797 に答える
4

ファイルから行うように、結果を使用FILE *results = _popen("netstat -a");して読み取ることができます (たとえば、、 など)。resultsfreadfgets

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 に近いものです。もし私が今日それを書いていたら、かなりの数のことを少なくとも少し違ったやり方でやっていただろうと確信しています.

于 2013-03-19T15:57:00.590 に答える