2011-01-30 9 views
2

未処理のソケットをリッスンしてコードを介してWebサイトから応答を読み取ろうとしていますが、これまでのところ、私が実際に興味を持っている着信応答。 着信応答を読むにはどうすればよいですか?未処理のソケットを使用して着信応答を読み取ることができません

EDIT:Wiresharkを使用して、探しているデータがTCP経由で送信されていることがわかりました。

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified); 
IPAddress localIP = Dns.GetHostByName(Dns.GetHostName()).AddressList[0]; 
listener.Bind(new IPEndPoint(localIP, 0)); 
byte[] invalue = new byte[4] { 1, 0, 0, 0 }; 
byte[] outvalue = new byte[4] { 1, 0, 0, 0 }; 
listener.IOControl(IOControlCode.ReceiveAll, invalue, outvalue); 
while (true) 
{ 
    byte[] buffer = new byte[1000000]; 
    int read = listener.Receive(buffer); 
    if (read >= 20) 
    { 
     Console.WriteLine("Packet from {0} to {1}, protocol {2}, size {3}", 
      new IPAddress((long)BitConverter.ToUInt32(buffer, 12)), 
      new IPAddress((long)BitConverter.ToUInt32(buffer, 16)), 
      buffer[9], 
      buffer[2] << 8 | buffer[3] 
     ); 
    } 
} 
+0

新しいIPEndPoint(localIP、0)は、ポート0でリッスンすることを指定します。リモートサーバーが接続しているポートですか? –

+0

@RobertLevy - 'new IPEndPoint(localIP、0)'はあなたが使用しているローカルポートを気にしないことを指定します。必要なときにシステムが選択します(必要な場合)。 (Bind、Send、Receive、...)ReceiveAllが設定されたRAWソケットの場合、すべてを受信して​​いるので、決して本当に必要なソケットはありません。 –

答えて

4

ポート0は、彼がすべてのポートでリッスンすると言う、私はあなたが代わりにProtocolType.IPにProtocolType.Unspecifiedを設定する必要があると思います。

new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw); は、私がmsdnで読んだものからProtocolType.IPだけがrawソケットでipv4でサポートされています。

また、私はこれがコネクションレスソケットであると考えていますか? ケースがそうでない限り、Reciveallは本当に影響を与えません。 IPヘッダの後にuは、このようなコードを設定することにより、それを得ることができる youreの場合:

Socket sck = new Socket(AddressFamily.InterNetwork , SocketType.Raw , ProtocolType.IP); 
    sck.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true); 

希望このことができます:)

+0

条件の中で、私はFirebugのNetタブと簡単にマッチすることができた文字列にバイト配列を変換しています。あなたが提案した変更で、私のプログラムはまだ私がFirebugで見ている応答を見ていないけれども、私は今、着信トラフィックの少しを得ています。私は昨日ソケットを調べ始めたにもかかわらず、これはコネクションレスであると信じています。 – CosworthTC

+0

+1ありがとうございます!ところで、MSDNの情報はどこで見つかりましたか? –

1

を、私は基本的に同じrawソケットを使用して、私のC++プログラムで同様の問題がありましたセットアップ。私の場合、デバッグビルドでは受信パケットが見えますが、リリースビルドでは見えません。発信パケットは両方のビルドで見られます。このプログラムではパケットを送信しません。

私はVS2008ネイティブC++でWin7 x64でビルドしています。

私のの問題は、ファイアウォールにありました。プロジェクトがVSで作成されたときは、プロジェクトのビルドによるネットワークアクセスのためにファイアウォールに「許可」エントリを追加していたようですが、プログラムのデバッグビルドに対してのみ許可されていました。

リリースビルドのために別のエントリを追加しなければならず、これで受信パケットが許可されました。 Win7のアドバンストファイアウォール設定では、特定のプロトコルがブロックされる可能性もあるため、受信したメッセージの一部しか受信しない場合は、プログラムのエントリの設定を確認してください。

1

今日私はまったく同じことをする方法が不思議でした!ここで私のコードは今働いているようですが、この作業をするためのクレジットは、ProtocolType.IPを提案するための仲間の回答者Tom Erikです。

static void Main(string[] args) 
    { 
     // Receive some arbitrary incoming IP traffic to an IPV4 address on your network adapter using the raw socket - requires admin privileges 
     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
     IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList 
      .Where((addr) => addr.AddressFamily == AddressFamily.InterNetwork) 
      .Where((addr) => addr.GetAddressBytes()[0] != 127) 
      .First(); 
     s.Bind(new IPEndPoint(ipAddress, 0)); 
     byte[] b = new byte[2000]; 
     EndPoint sender = new IPEndPoint(0, 0); 
     int nr = s.ReceiveFrom(b, SocketFlags.None, ref sender); 
    } 
+0

SocketType.Rawを使用すると、既にIPV4パケット用にHeaderIncludedを受け取ることになります。 Ref:http://msdn.microsoft.com/en-us/library/ms740548(VS.85).aspx –

関連する問題