当前位置:  开发笔记 > 编程语言 > 正文

C#获取包数据

如何解决《C#获取包数据》经验,为你挑选了3个好方法。

我一直在尝试编写一个可以嗅探HTTP头的脚本.到目前为止,我已经将套接字绑定到端口80并且数据包似乎已被接收,但我无法将它们转换为字符串形式.所有输出都是"E"连续.我之前将字节更改为十六进制,似乎有一些数据进入,但当前代码无法将字节更改为字符串.有没有其他方法解码将提供正确字符串的字节?

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(strIP), 80));
s.IOControl(IOControlCode.ReceiveAll, input, null);
int bytes;
bytes = s.Receive(buffer);
while (bytes > 0)
{
    log(System.Text.Encoding.ASCII.GetString(buffer, 0, bytes));
    bytes = s.Receive(buffer);
}

Matt Davis.. 6

当您使用原始套接字嗅探数据时,您将收到Internet协议(IP)数据包.每个IP数据包都以IP标头开头.此标头通常长20个字节,但可能比此长.IP报头之后是传输层的报头,例如传输控制协议(TCP)报头或用户数据报协议(UDP)报头.在此标题之后是您要查找的数据,即HTTP.因此,当您解析数据时,您需要首先跳过IP标头和传输层标头.



1> Matt Davis..:

当您使用原始套接字嗅探数据时,您将收到Internet协议(IP)数据包.每个IP数据包都以IP标头开头.此标头通常长20个字节,但可能比此长.IP报头之后是传输层的报头,例如传输控制协议(TCP)报头或用户数据报协议(UDP)报头.在此标题之后是您要查找的数据,即HTTP.因此,当您解析数据时,您需要首先跳过IP标头和传输层标头.



2> BrainCore..:

您可能需要在此处查看此C#网络嗅探器的源代码.



3> Mark Byers..:

首先,为什么要使用原始套接字并更改IOControl来编写它?我尝试在Vista上运行你的代码,即使是管理员也无法运行.您可以使用更高级别的抽象,例如TcpClient吗?

其次,您需要在收到回复之前发送请求.您可以发送的最简单的请求是"GET/\n",其中\n是新行的字符.

下面是一些您可以使用的代码(Write方法也需要检查返回值,但为简单起见省略了这一点):

        using (TcpClient tcpClient = new TcpClient(strIP, 80))
        {
            using (Stream s = tcpClient.GetStream())
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes("GET /\n");
                s.Write(bytesToSend, 0, bytesToSend.Length);
                int bytes;
                byte[] buffer = new byte[4096];
                do
                {
                    bytes = s.Read(buffer, 0, buffer.Length);
                    Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes));
                } while (bytes > 0);
            }
        }

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有