Win32API IPHLPAPI IPヘッダのTTLの値を設定する SetIpTTL

IPヘッダのTTLの値を変更するには、SetIpTTL関数を用いる。


  • SetIpTTLのプロトタイプ
  • DWORD SetIpTTL(
      __in  UINT nTTL
    );



  • 戻り値は、以下の通り

  • NO_ERROR成功
    ERROR_ACCESS_DENIEDアクセスが拒否された
    ERROR_INVALID_PARAMETER関数に無効な引数が渡された
    その他GetLastError関数及びFormatMessage関数で取得する


  • SetIpTTL関数を使用するためには、「iphlpapi.h」をインクルードし、「iphlpapi.lib」をリンクする必要がある

  • 使用例:TTLを1に設定する
  • #include <windows.h>
    #include <iphlpapi.h>
    #pragma comment(lib, "iphlpapi.lib")
    
    int main()
    {
      switch (<span style="color:#FF0000;">SetIpTTL(1)</span>) {
        case NO_ERROR:
          puts("NO_ERROR");
          break;
    
        case ERROR_ACCESS_DENIED:
          puts("ERROR_ACCESS_DENIED");
          break;
    
        case ERROR_INVALID_PARAMETER:
          puts("ERROR_INVALID_PARAMETER");
          break;
    
        default:
          puts("Other Error");
          break;
      }
    
      return 0;
    }


  • 実行する際の注意点

  • 1.OSの種類によっては、管理者権限で実行する必要がある(管理者権限で実行しないとSetIpTTLの戻り値がERROR_ACCESS_DENIEDになってしまう場合がある)。Windows Vistaなどがこれに該当する。管理者権限で実行するためには、実行ファイルを右クリックし、ポップアップメニューを表示し「管理者として実行」から実行する

  • 2.SetIpTTLを実行すると、OS全体に設定が反映されるので、すべての通信アプリケーションのIPヘッダのTTLに変更が適用される。


  • 実行後、WiresharkでIPパケットを表示させると、TTLが1に設定されていることがわかる(TTLが1ではインターネットに接続できなくなってしまいますが)。


  • 参考
    http://msdn.microsoft.com/en-us/library/aa366369(VS.85).aspx