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