2013-03-19 305 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