IPに関する統計情報を取得する

IPHLPAPIのGetIpStatistics()を使うとIPに関する統計情報を取得することができます。 ここでは、GetIpStatistics()の使い方を説明します。

サンプルコード

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


#include <stdio.h>

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

int
main()
{
 MIB_IPSTATS ipstats;

 if (GetIpStatistics(&ipstats) == NOERROR) {
   printf("dwForwarding :     %ld\n", ipstats.dwForwarding);
   printf("dwDefaultTTL:      %ld\n", ipstats.dwDefaultTTL);
   printf("dwInReceives:      %ld\n", ipstats.dwInReceives);
   printf("dwInHdrErrors:     %ld\n", ipstats.dwInHdrErrors);
   printf("dwInAddrErrors:    %ld\n", ipstats.dwInAddrErrors);
   printf("dwForwDatagrams:   %ld\n", ipstats.dwForwDatagrams);
   printf("dwInUnknownProtos: %ld\n", ipstats.dwInUnknownProtos);
   printf("dwInDiscards:      %ld\n", ipstats.dwInDiscards);
   printf("dwInDelivers:      %ld\n", ipstats.dwInDelivers);
   printf("dwOutRequests:     %ld\n", ipstats.dwOutRequests);
   printf("dwRoutingDiscards: %ld\n", ipstats.dwRoutingDiscards);
   printf("dwOutDiscards:     %ld\n", ipstats.dwOutDiscards);
   printf("dwOutNoRoutes:     %ld\n", ipstats.dwOutNoRoutes);
   printf("dwReasmTimeout:    %ld\n", ipstats.dwReasmTimeout);
   printf("dwReasmReqds:      %ld\n", ipstats.dwReasmReqds);
   printf("dwReasmOks:        %ld\n", ipstats.dwReasmOks);
   printf("dwReasmFails:      %ld\n", ipstats.dwReasmFails);
   printf("dwFragOks:         %ld\n", ipstats.dwFragOks);
   printf("dwFragFails:       %ld\n", ipstats.dwFragFails);
   printf("dwFragCreates:     %ld\n", ipstats.dwFragCreates);
   printf("dwNumIf:           %ld\n", ipstats.dwNumIf);
   printf("dwNumAddr:         %ld\n", ipstats.dwNumAddr);
   printf("dwNumRoutes:       %ld\n", ipstats.dwNumRoutes);
 } else {
   printf("GetIpStatistics failed : %d\n", GetLastError());
 }

 return 0;
}

サンプルコード実行例

上記コードをコンパイルして出来たものを実行すると、以下のようになります。


C:> a.exe
dwForwarding :     2
dwDefaultTTL:      128
dwInReceives:      548610
dwInHdrErrors:     0
dwInAddrErrors:    283
dwForwDatagrams:   0
dwInUnknownProtos: 0
dwInDiscards:      0
dwInDelivers:      548574
dwOutRequests:     255708
dwRoutingDiscards: 0
dwOutDiscards:     0
dwOutNoRoutes:     0
dwReasmTimeout:    60
dwReasmReqds:      0
dwReasmOks:        0
dwReasmFails:      0
dwFragOks:         0
dwFragFails:       0
dwFragCreates:     0
dwNumIf:           2
dwNumAddr:         2
dwNumRoutes:       7

GetIpStatistics()が利用する構造体

GetIpStatistics()が利用する構造体MIB_IPSTATSを以下に示します。


typedef struct _MIB_IPSTATS {
  DWORD dwForwarding;
  DWORD dwDefaultTTL;
  DWORD dwInReceives;
  DWORD dwInHdrErrors;
  DWORD dwInAddrErrors;
  DWORD dwForwDatagrams;
  DWORD dwInUnknownProtos;
  DWORD dwInDiscards;
  DWORD dwInDelivers;
  DWORD dwOutRequests;
  DWORD dwRoutingDiscards;
  DWORD dwOutDiscards;
  DWORD dwOutNoRoutes;
  DWORD dwReasmTimeout;
  DWORD dwReasmReqds;
  DWORD dwReasmOks;
  DWORD dwReasmFails;
  DWORD dwFragOks;
  DWORD dwFragFails;
  DWORD dwFragCreates;
  DWORD dwNumIf;
  DWORD dwNumAddr;
  DWORD dwNumRoutes;
} MIB_IPSTATS, *PMIB_IPSTATS;

dwForwarding IPフォワーディングのEnabled/Disabledを示します。
dwDefaultTTL Default TTL(Time-To-Live)です。
dwInReceives 受信したデータグラムの数です。
dwInHdrErrors ヘッダエラーを含むデータグラムを受信した数です。
dwInAddrErrors アドレスエラーを含むデータグラムを受信した数です。
dwForwDatagrams フォワードしたデータグラムの数です。
dwInUnknownProtos 不明なプロトコルを持つデータグラムを受信した数です。
dwInDiscards Discardしたデータグラムの数です。
dwInDelivers 受信したデータグラムのうち、配送されたものの数です。
dwOutRequests 送信しようとしたデータグラムの数です。dwForwDatagramsの値は含まれません。
dwRoutingDiscards 送信されずにDiscardされたデータグラムの数です。
dwOutDiscards Discardされた転送データグラムの数です。
dwOutNoRoutes 経路が存在せずにDiscardされたデータグラムの数です。
dwReasmTimeout フラグメントされたデータグラムのリアセンブルをあきらめるまでのタイムアウトです。
dwReasmReqds リアセンブルを要求したデータグラムの数です。
dwReasmOks リアセンブルが成功したデータグラムの数です。
dwReasmFails リアセンブルが失敗したデータグラムの数です。
dwFragOks フラグメントが成功したデータグラム数です。
dwFragFails フラグメントが失敗したデータグラム数です。
dwFragCreates 生成されたフラグメント数です。
dwNumIf インターフェース数です。
dwNumAddr ローカルマシンに関連するIPアドレスの数です。
dwNumRoutes 経路表にある経路の数です。

IPv6基礎検定

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