0

これは、HTTP を監視するための私のコードです。

static void Main(string[] args)
{
     try
     {
          byte[] input = BitConverter.GetBytes(1);
          byte[] buffer = new byte[4096];
          Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
          s.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80));
          s.IOControl(IOControlCode.ReceiveAll, input, null);
          s.BeginReceive(arrResponseBytes, 0, arrResponseBytes.Length, SocketFlags.None, new AsyncCallback(OnClientReceive), s);
          System.Threading.ManualResetEvent reset = new System.Threading.ManualResetEvent(false);
          reset.WaitOne();
      }
      catch (Exception ex)
      {
          Console.WriteLine(ex);
      }
      Console.ReadKey();
}

static byte[] arrResponseBytes = new byte[1024 * 5];
protected static void OnClientReceive(IAsyncResult ar)
{
     Socket socket = (Socket)ar.AsyncState;
     int count = socket.EndReceive(ar);
     if (count > 0)
     {
          Console.WriteLine(Encoding.ASCII.GetString(arrResponseBytes, 0, count));
          socket.BeginReceive(arrResponseBytes, 0, arrResponseBytes.Length, SocketFlags.None, new AsyncCallback(OnClientReceive), socket);
     }
}

しかし、httpホストを取得できません。何のデータかわかりません。たとえば、http ホストを取得したい: http://google.com システム http を監視するにはどうすればよいですか? ありがとう。

4

1 に答える 1

0

リンクに表示されるのは、IP + TCP ヘッダーです。コンテンツを抽出するには、IP&TCP ヘッダーを解析する必要があります。TCP コンテンツは、およそオフセット 40 から始まります。そのため、以下のようにプログラムの修正バージョンを試して、各HTTPリクエストのコンテンツを確認できます。(アイデアを提供するためだけに動作しますが、完全なプログラムではありません)

PS: を参照してください。s.Bind(new IPEndPoint(IPAddress.Broadcast, 80));

static void Main(string[] args)
{
    try
    {
        byte[] input = new byte[]{1};
        byte[] buffer = new byte[4096];
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
        s.Bind(new IPEndPoint(IPAddress.Broadcast, 80));
        s.IOControl(IOControlCode.ReceiveAll , input, null);
        s.BeginReceive(arrResponseBytes, 0, arrResponseBytes.Length, SocketFlags.None, new AsyncCallback(OnClientReceive), s);
        System.Threading.ManualResetEvent reset = new System.Threading.ManualResetEvent(false);
        reset.WaitOne();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    Console.ReadKey();
}

static byte[] arrResponseBytes = new byte[1024 * 64];
static void OnClientReceive(IAsyncResult ar)
{
    Socket socket = (Socket)ar.AsyncState;
    int count = socket.EndReceive(ar);
    if (count >= 40)
    {
        try
        {
            string s = Encoding.UTF8.GetString(arrResponseBytes, 40, count - 40);
            string bin = BitConverter.ToString(arrResponseBytes, 40, count - 40).Replace("-", " ");
            if(s.StartsWith("GET"))
                Console.WriteLine(s + " - " + bin);
            //Thread.Sleep(1000);
        }
        catch { }
    }
    socket.BeginReceive(arrResponseBytes, 0, arrResponseBytes.Length, SocketFlags.None, new AsyncCallback(OnClientReceive), socket);
}
于 2012-07-09T11:04:36.247 に答える