TCP接続情報一覧を取得する
WindowsでどのようなTCPポートが開かれているのか知りたい場合があると思います。 GetTcpTable()関数を使います。 ここでは、GetTcpTable()の使い方を説明します。
サンプルコード
GetTcpTable()を使ったサンプルコードを以下に示します。
#include <stdio.h>
#include <winsock2.h>
#include <iphlpapi.h>
int
main()
{
DWORD i;
PMIB_TCPTABLE pTcpTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char *addr_ptr;
unsigned short *port_ptr;
/* GetTcpTable()で必要になるサイズを取得 */
if (GetTcpTable(NULL, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
pTcpTable = (MIB_TCPTABLE *) malloc (dwSize);
}
/* 実際にGetTcpTable()を使う */
if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, 0))
== NO_ERROR) {
if (pTcpTable->dwNumEntries > 0) {
for (i=0; i<pTcpTable->dwNumEntries; i++) {
addr_ptr = (char *)&pTcpTable->table[i].dwLocalAddr;
printf("Local Address: %s\n",
inet_ntoa(*(struct in_addr *)addr_ptr));
port_ptr = (unsigned short *)&pTcpTable->table[i].dwLocalPort;
printf("Local Port: %ld\n",
htons(*port_ptr));
addr_ptr = (char *)&pTcpTable->table[i].dwRemoteAddr;
printf("Remote Address: %s\n",
inet_ntoa(*(struct in_addr *)addr_ptr));
port_ptr = (unsigned short *)&pTcpTable->table[i].dwRemotePort;
printf("Remote Port: %ld\n",
htons(*port_ptr));
printf("State: %ld\n", pTcpTable->table[i].dwState);
printf("\n");
}
}
} else {
printf("GetTcpTable failed.\n");
LPVOID lpMsgBuf;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwRetVal,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULT), //Default language
(LPTSTR) &lpMsgBuf,
0,
NULL )) {
printf("\tError: %s", lpMsgBuf);
}
LocalFree( lpMsgBuf );
}
return 0;
}
サンプルコード実行例
上記コードをコンパイルして出来たものを実行すると、以下のようになります。
C:> a.exe
Local Address: 0.0.0.0
Local Port: 445
Remote Address: 0.0.0.0
Remote Port: 45262
State: 2
Local Address: 0.0.0.0
Local Port: 135
Remote Address: 0.0.0.0
Remote Port: 2176
State: 2
Local Address: 0.0.0.0
Local Port: 1025
Remote Address: 0.0.0.0
Remote Port: 8332
State: 2
Local Address: 0.0.0.0
Local Port: 1029
Remote Address: 0.0.0.0
Remote Port: 2096
State: 2
GetTcpTable()が利用する構造体
GetIpNetTable()が利用している、MIB_TCPTABLEは以下のように宣言されています。
typedef struct _MIB_TCPROW {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
} MIB_TCPROW, *PMIB_TCPROW;
typedef struct _MIB_TCPTABLE {
DWORD dwNumEntries;
MIB_TCPROW table[ANY_SIZE];
} MIB_TCPTABLE, *PMIB_TCPTABLE;
MIB_TCPROW
dwState | TCP接続の状態です。 |
dwLocalAddr | ローカルのIPアドレス(IPv4)です。 |
dwLocalPort | ローカルのTCPポートです。 |
dwRemoteAddr | 接続相手のIPアドレス(IPv4)です。 |
dwRemotePort | 接続相手のポートです。 |
MIB_TCPTABLE
dwNumEntries | TCPエントリの数が入ります。 |
table | MIB_TCPROWの配列として、個々のTCPエントリが格納されます。配列の長さはdwNumEntriesによって表されます。 |