2016-11-08 2 views
0

私はいくつかの時間のためにGoogleの周りを探してきたと私は答えを見つけるように見えるcan`t ...WindowsのIPごとにPORTの接続数を取得する方法は?

私は私の現在の接続を表示するためにGetExtendedTcpTable()を使用していますが、私は番号を取得することができません各IPが特定のPORT上で行う接続の数。

これに関するサンプル/機能はありますか?あるいは私は何かを作らなければならないのですか?

ご迷惑をおかけして申し訳ございません。

楽しい一日を!

+1

あなたは 'TCP_TABLE_BASIC_CONNECTIONS'テーブルを歩き、特定のポートへの接続数を自分で計算する必要があります。このサマリーデータを自動的に与えるための組み込みAPIはありません。それを計算することは比較的容易でなければならない。 – Petesh

+0

@Peteshこの情報をありがとう、私は何かをモックアップしようとします! –

+0

@Petesh現時点で私はTCP_TABLE_OWNER_PID_ALLを使用しています –

答えて

0

this code from MSDN as the basisを使用すると、接続リストが列挙され、portsへのポインタにリモートシステムからローカルポートへの接続数が入力されます。

特定のローカルポートへの接続数を確認するには、単にports[port]の値を出力するだけです。

コードは、C++よりずっと多く、ポートにはnew[]delete[]を使用しました。

#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <iphlpapi.h> 
#include <stdio.h> 

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

#define MALLOC(x) calloc(1, (x)) 
#define FREE(x) free((x)) 

int main() 
{ 
    // Declare and initialize variables 
    PMIB_TCPTABLE_OWNER_PID pTcpTable; 
    int *ports; // an array of all the possible ports 
    DWORD dwSize = 0; 
    DWORD dwRetVal = 0; 

    char szRemoteAddr[128]; 

    struct in_addr IpAddr; 

    int i; 

    ports = new int[1 << (sizeof(u_short) * 8)](); 

    pTcpTable = (MIB_TCPTABLE_OWNER_PID *)MALLOC(sizeof(MIB_TCPTABLE_OWNER_PID)); 
    if (pTcpTable == NULL) { 
     printf("Error allocating memory\n"); 
     return 1; 
    } 

    dwSize = sizeof(MIB_TCPTABLE); 
    // Make an initial call to GetTcpTable to 
    // get the necessary size into the dwSize variable 
    if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_BASIC_CONNECTIONS, 0)) == 
     ERROR_INSUFFICIENT_BUFFER) { 
     FREE(pTcpTable); 
     pTcpTable = (MIB_TCPTABLE_OWNER_PID *)MALLOC(dwSize); 
     if (pTcpTable == NULL) { 
      printf("Error allocating memory\n"); 
      return 1; 
     } 
    } 
    // Make a second call to GetTcpTable to get 
    // the actual data we require 
    if ((dwRetVal = GetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_BASIC_CONNECTIONS, 0)) == NO_ERROR) { 
     printf("\tNumber of entries: %d\n", (int)pTcpTable->dwNumEntries); 
     for (i = 0; i < (int)pTcpTable->dwNumEntries; i++) { 
      printf("\n\tTCP[%d] State: %ld - ", i, 
       pTcpTable->table[i].dwState); 
      if (pTcpTable->table[i].dwState != MIB_TCP_STATE_ESTAB) 
       continue; 

      // get the port in host order 
      u_short port = ntohs((u_short)pTcpTable->table[i].dwLocalPort); 
      ports[port] += 1; // increment this port 

      IpAddr.S_un.S_addr = (u_long)pTcpTable->table[i].dwRemoteAddr; 
      inet_ntop(AF_INET, &IpAddr, szRemoteAddr, sizeof(szRemoteAddr)); 
      printf("\tTCP[%d] Remote Addr: %s:%d\n", i, szRemoteAddr, ntohs((u_short)pTcpTable->table[i].dwRemotePort)); 
     } 
    } 
    else { 
     printf("\tGetExtendedTcpTable failed with %d\n", dwRetVal); 
     FREE(pTcpTable); 
     delete[] ports; 
     return 1; 
    } 

    if (pTcpTable != NULL) { 
     FREE(pTcpTable); 
     pTcpTable = NULL; 
    } 
    delete[] ports; 
    return 0; 
} 

今あなたがポートに来たリモートアドレスのリストを望んでいた場合は、std::vector<std::string> remote_addressesを作ることができるとあなたはポートが正しかったと判断したときにremote_addresses.push_back(szRemoteAddr)を行います。

GetExtendedTcpTableへの最初の呼び出しとその後のGetExtendedTcpTableへの呼び出しの間に別の接続が入り、dwSizeの値が増加する潜在的な競合状態があります。この場合、メモリを増やすことをお勧めします。最初の呼び出し後に、必要以上に8Kを求めてみてください。大きな問題にはなりません。

+0

ありがとう、私はすでにすべての接続をリストするこのような何かを持っていましたが、特定のポートへのIP ... –

関連する問題