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によって表されます。

YouTubeチャンネルやってます!