UDP接続情報一覧を取得する

WindowsでどのようなUDPポートが開かれているのか知りたい場合があると思います。 GetUdpTable()関数を使います。 ここでは、GetUdpTable()の使い方を説明します。

サンプルコード

GetUdpTable()を使ったサンプルコードを以下に示します。


#include <stdio.h>

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

int
main()
{
 DWORD i;
 PMIB_UDPTABLE pUdpTable;
 DWORD dwSize = 0;
 DWORD dwRetVal = 0;

 char *addr_ptr;
 unsigned short *port_ptr;

 /* GetUdpTable()で必要になるサイズを取得 */
 if (GetUdpTable(NULL, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
   pUdpTable = (MIB_UDPTABLE *) malloc (dwSize);
 }

 /* 実際にGetUdpTable()を使う */
 if ((dwRetVal = GetUdpTable(pUdpTable, &dwSize, 0))
      == NO_ERROR) {
   if (pUdpTable->dwNumEntries > 0) {
     for (i=0; i<pUdpTable->dwNumEntries; i++) {
       addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr;
       printf("Local Address: %s\n",
        inet_ntoa(*(struct in_addr *)addr_ptr));

       port_ptr = (unsigned short *)&pUdpTable->table[i].dwLocalPort;
       printf("Local Port:    %ld\n",
         htons(*port_ptr));

       printf("\n");
     }
   }
 } else {
   printf("GetUdpTable 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:    1028

Local Address: 127.0.0.1
Local Port:    123

Local Address: 127.0.0.1
Local Port:    1876

Local Address: 0.0.0.0
Local Port:    1026

GetUdpTable()が利用する構造体

GetUdpTable()が利用している、MIB_UDPTABLEは以下のように宣言されています。


typedef struct _MIB_UDPROW {
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
} MIB_UDPROW, *PMIB_UDPROW;

typedef struct _MIB_UDPTABLE {
  DWORD dwNumEntries;
  MIB_UDPROW table[ANY_SIZE];
} MIB_UDPTABLE, *PMIB_UDPTABLE;

MIB_UDPROW

dwLocalAddr UDPがbindされているローカルIPアドレス(IPv4)です。
dwLocalPort UDPのポートです。

MIB_UDPTABLE

dwNumEntries UDPエントリの数が入ります。
table MIB_UDPROWの配列として、個々のUDPエントリが格納されます。配列の長さはdwNumEntriesによって表されます。

IPv6基礎検定

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