2009-08-21 32 views
2

C#でTCP tracerouteを実行するにはどうすればよいですか?それも可能ですか?C#のTCPトレースルート

+0

何「TCPのトレースルート」:あなたがルートに沿って各ホスト上に接続するために望んでいるだろうTCPソケット? tracerouteは、TCPではなくICMPを使用して実装されています。 – ChrisW

+0

彼らはhpingのようなツールを作りたいと思っていますか? – 48klocs

+0

http://en.wikipedia.org/wiki/Tcptraceroute http://michael.toren.net/code/tcptraceroute/ http://tracetcp.sourceforge.net/ だけで、hpingをやろうとしませんHTTPに依存するtracerouteは、pcapのようなある種のパケットスニッファ/ドライバを使わなくてもC#で可能かどうかを知りたがっていました。 – webly

答えて

2

rawソケットを介してTCPパケットを送信することはできませんので、手作業でTCPパケットを生成するにはraw ethernetフレームが必要です。

nmapが生のイーサネットフレームを取得する方法を参照してください。それを繰り返します。 MSFTから

+0

私はこれを使うことができますか? http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx 彼はC# – webly

+0

を使用してネットワークスニファを実装しているようです。そのようにしたいものはすべて読むことができますが、送信TCPパケットは決して電線に届きません。 – Joshua

+0

私は少しこれを読んでいた、それは生のパケット制限を引き起こしたWindows XP SP2の修正であったようです - 私のアプリケーションがWindowsサーバー2008を対象としている場合はどうなりますか?この限界もありますか? – webly

0

:Windows 7のサービスパック2(SP2)でのWindows Server 2008 R2、Windows Vista、およびWindows XP上でhttp://msdn.microsoft.com/en-us/library/ms740548(VS.85).aspx

、rawソケットを介してトラフィックを送信する機能は、いくつかの方法で制限されています:

  • ソケットでTCPデータを送信できません。
  • 無効な送信元のUDPデータグラム は、 ソケットでは送信できません。 の送信元UDPデータグラムのIP送信元アドレスは、ネットワークインターフェイス上に 、またはデータグラム が存在する必要があります。この変更は 、サービス拒否攻撃を分散し、偽装されたパケットに (偽造ソース IPアドレスを持つTCP/IPパケット)を送信するために 能力が制限を作成するために、 悪意のあるコードの能力を制限するために作られた ました。
  • ローソケット を使用してバインド関数を呼び出すことはできません。

上記の制限は、Windows Server 2008、Windows Server 2003、またはWindows XP SP2以前のオペレーティングシステムのバージョンには適用されません。

2

C#でtracerouteを実行したい場合は、パケットを使いこなす必要はありません。 tracerouteは、1からnまでのTTLを持つ多くのpingで構成されています。これは.NetフレームワークのPingクラスでアーカイブできます。ここで

は私のいくつかの古いコードで、それはかなりではないのですが、それは動作するはずです:

/// <summary> 
    /// Performs a pathping 
    /// </summary> 
    /// <param name="ipaTarget">The target</param> 
    /// <param name="iHopcount">The maximum hopcount</param> 
    /// <param name="iTimeout">The timeout for each ping</param> 
    /// <returns>An array of PingReplys for the whole path</returns> 
    public PingReply[] PerformPathping(IPAddress ipaTarget, int iHopcount, int iTimeout) 
    { 
     System.Collections.ArrayList arlPingReply = new System.Collections.ArrayList(); 
     Ping myPing = new Ping(); 
     PingReply prResult; 
     for (int iC1 = 1; iC1 < iHopcount; iC1++) 
     { 
      prResult = myPing.Send(ipaTarget, iTimeout, new byte[10], new PingOptions(iC1, false)); 
      if (prResult.Status == IPStatus.Success) 
      { 
       iC1 = iHopcount; 
      } 
      arlPingReply.Add(prResult); 
     } 
     PingReply[] prReturnValue = new PingReply[arlPingReply.Count]; 
     for (int iC1 = 0; iC1 < arlPingReply.Count; iC1++) 
     { 
      prReturnValue[iC1] = (PingReply)arlPingReply[iC1]; 
     } 
     return prReturnValue; 
    }