2013-03-19 112 views
1

我试图在我的电脑中以C++代码获得打开的端口列表。因此,我想使用DOS命令netstat。我写了这行system("netstat -a"),但我无法检索它返回的结果。如何检索netstat命令的结果

回答

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); 
} 
3

你可以使用FILE *results = _popen("netstat -a");,然后读取results结果就像你从一个文件将(例如,freadfgets等)

或者,你可以使用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++。如果我今天写这篇文章,我很确定我会做很多事情,至少有一点不同。

+0

它完美,但只是我想知道的是什么将localPort和远程端口之间的区别开始? – Bacem 2013-03-19 16:22:46

+0

@Bacem:脱离主题,但本地端口是本地计算机上的端口,远程端口是远程计算机上的端口。因此,例如,如果我浏览SO,我的本地端口可能是192.168.1.10:60123(即本地计算机上的端口60123),而远程端口可能是www.stackoverflow.com上的端口80(虽然端口80通常会显示作为'www')。 – 2013-03-19 16:34:16