私はいくつかの時間のためにGoogleの周りを探してきたと私は答えを見つけるように見えるcan`t ...WindowsのIPごとにPORTの接続数を取得する方法は?
私は私の現在の接続を表示するためにGetExtendedTcpTable()を使用していますが、私は番号を取得することができません各IPが特定のPORT上で行う接続の数。
これに関するサンプル/機能はありますか?あるいは私は何かを作らなければならないのですか?
ご迷惑をおかけして申し訳ございません。
楽しい一日を!
私はいくつかの時間のためにGoogleの周りを探してきたと私は答えを見つけるように見えるcan`t ...WindowsのIPごとにPORTの接続数を取得する方法は?
私は私の現在の接続を表示するためにGetExtendedTcpTable()を使用していますが、私は番号を取得することができません各IPが特定のPORT上で行う接続の数。
これに関するサンプル/機能はありますか?あるいは私は何かを作らなければならないのですか?
ご迷惑をおかけして申し訳ございません。
楽しい一日を!
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を求めてみてください。大きな問題にはなりません。
ありがとう、私はすでにすべての接続をリストするこのような何かを持っていましたが、特定のポートへのIP ... –
あなたは 'TCP_TABLE_BASIC_CONNECTIONS'テーブルを歩き、特定のポートへの接続数を自分で計算する必要があります。このサマリーデータを自動的に与えるための組み込みAPIはありません。それを計算することは比較的容易でなければならない。 – Petesh
@Peteshこの情報をありがとう、私は何かをモックアップしようとします! –
@Petesh現時点で私はTCP_TABLE_OWNER_PID_ALLを使用しています –