关于c#实现影音嗅探的问题

这几天参考网上的RawSocket初步些了个,但发现丢包现象严重,效果很不理想很多时候都嗅探不出来
后来借助httpwatch的API接口页很理想,大家有什么关于.net上的实现思虑么? vb.net或c#都行 


下面这个基类是我仿照网上些的
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Net;

namespace v.sniffer
{
    /**
     * IP数据包结构,解释完毕的包存放到这里,最终用它来组成总的数据
     */
    [StructLayout(LayoutKind.Explicit)]
    public struct IPHeader
    {
        [FieldOffset(0)]
        public byte ip_verlen;        //I4位首部长度+4位IP版本号
        [FieldOffset(1)]
        public byte ip_tos;            //8位服务类型TOS
        [FieldOffset(2)]
        public ushort ip_totallength; //16位数据包总长度(字节)
        [FieldOffset(4)]
        public ushort ip_id;             //16位标识
        [FieldOffset(6)]
        public ushort ip_offset;       //3位标志位
        [FieldOffset(8)]
        public byte ip_ttl;            //8位生存时间 TTL
        [FieldOffset(9)]
        public byte ip_protocol;    //8位协议(TCP, UDP, ICMP, Etc.)
        [FieldOffset(10)]
        public ushort ip_checksum; //16位IP首部校验和
        [FieldOffset(12)]
        public uint ip_srcaddr;     //32位源IP地址
        [FieldOffset(16)]
        public uint ip_destaddr;   //32位目的IP地址
    }

    public class RawSocket
    {
        private bool error_occurred;          //套接字在接收包时是否产生错误
        public bool KeepRunning;              //是否继续进行
        private int len_receive_buf;       //得到的数据流的长度
        byte[] receive_buf_bytes;          //收到的字节
        private Socket socket = null;       //声明套接字
        const int SIO_RCVALL = unchecked((int)0x98000001);//监听所有的数据包

        /**
         * 构造函数
         */
        public RawSocket()
        {
            error_occurred = false;//没有产生错误
            len_receive_buf = 4096;//接收的数据流的长度
            receive_buf_bytes = new byte[len_receive_buf];//接收的内容
        }

        /**
         * 建立并绑定套接字
         *
         * @param 要监听的IP地址,单网卡的可以直接通过Dns.GetHostByName(Dns.GetHostEntry()).AddressList[0].ToString()方式来指定监听本地
         */
        public void CreateAndBindSocket(string IP)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
            socket.Blocking = false;                                         //设置socket非阻塞状态
            socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0)); //绑定套接字

            if (SetSocketOption() == false) error_occurred = true;//开始侦听数据
        }

        /**
         * 侦听数据包的参数
         */
        private bool SetSocketOption()                           //设置raw socket
        {
            bool ret_value = true;
            try
            {
                socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
                byte[] IN = new byte[4] { 1, 0, 0, 0 };
                byte[] OUT = new byte[4];

                //低级别操作模式,接受所有的数据包,这一步是关键,必须把socket设成raw和IP Level才可用SIO_RCVALL
                int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT);
                ret_code = OUT[0] + OUT[1] + OUT[2] + OUT[3];//把4个8位字节合成一个32位整数
                if (ret_code != 0) ret_value = false;
            }
            catch (SocketException)
            {
                ret_value = false;
            }
            return ret_value;
        }

        public bool ErrorOccurred
        {
            get
            {
                return error_occurred;
            }
        }
        //解析接收的数据包,形成PacketArrivedEventArgs事件数据类对象,并引发PacketArrival事件
        unsafe private void Receive(byte[] buf, int len)
        {
            byte temp_protocol = 0;//协议
            uint temp_version = 0;//版本
            uint temp_ip_srcaddr = 0;//源地址
            uint temp_ip_destaddr = 0;//目的地址
            short temp_srcport = 0;//源端口
            short temp_dstport = 0;//目标端口
            IPAddress temp_ip;//IP地址

            PacketArrivedEventArgs e = new PacketArrivedEventArgs();//新网络数据包信息事件

            fixed (byte* fixed_buf = buf)
            {
                IPHeader* head = (IPHeader*)fixed_buf;//把数据流整和为IPHeader结构
                e.HeaderLength = (uint)(head->ip_verlen & 0x0F) << 2;
                e.IPHeaderBuffer = new byte[e.HeaderLength];

                temp_protocol = head->ip_protocol;
                switch (temp_protocol)//提取协议类型
                {
                    case 1: e.Protocol = "ICMP"; break;
                    ca
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
—————————————————————— Hearen's SimpleSniffer —————————————————————— 一、功能简介: .针对同一局域网中的所有主机进行监听并返回处理优化后的数据供研究使用; .在数据表中显示了所有当前侦听到的数据包包括源IP、源端口、目的IP、目的端口、数据包协议类型、数据包捕获时间及数据包简略信息(仅应用层数据); .可以针对某一特定IP地址(源或目的),某特定端口(源或目的)以及特定类型数据包进行侦听 -- 捕获前过滤; .当数据过多时可以随时点击‘清理’对当前的数据表进行清空 -- 不过捕获的数据是不会被清除的,仅清除列表中显示的数据; .双击‘清理’时清空所有到的数据 -- 不仅仅是列表中显示的数据; .选择列表中的数据时,数据详细信息会显示在下方的面板中; 此时可以通过选择特定字符串来查看在其左侧的十六进制表示以供研究之用; .左下角会显示当前在该局域网中捕获到的数据包个数及总大小(该大小包含IP协议及其建立在该协议以上协议的头部)-- 数据单位会自动进行切换当数据大小达到2G时将重置清零; .在获取数据包后可以针对某一IP,PORT,IP:PORT或IP/PORT及协议进行筛选,同时可以查阅当前所有捕获的数据包(如果没有设置捕获前过滤,否则只能查阅过滤后的数据)。 二、使用说明:本应用的使用环境为Windows 7、Windows 8及Windows 8.1。 在使用过程中需要获得管理员权限 - 捕获数据包需要访问底层数据,需要获得最高权限才可以正常运行该应用; 三、作者留言 该应用的开发环境为VS2013,所用语言为C#,界面设计属于WinForm(比较老式的界面风格,推荐使用WPF)。因本人水平有限,在该应用中不免存在很多漏洞和不足;如果你有更多更好的想法或者发现该小应用中的bug还望批评指正。
一、功能简介: 1.针对同一局域网中的所有主机进行监听并返回处理优化后的数据供用户研究使用; 2.在数据表中显示了所有当前侦听到的数据包包括源IP、源端口、目的IP、目的端口、数据包协议类型、数据包捕获时间及数据包简略信息(仅应用层数据); 3.可以对某种特定类型协议的数据进行针对性监听; 4.可以针对某一特定源IP地址进行侦听; 5.当数据过多时可以随时点击‘清理’对当前的数据表进行清空 - 不过捕获的数据是不会被清除的,仅清除列表中的数据; 6.在数据显示区域可以通过选择特定字符串以此查看在其左侧的十六进制表示以供研究之用; 7.在应用左下角显示当前应用在该局域网中捕获到的数据包个数及总大小(该大小包含IP协议及其建立在该协议以上协议的头部)- 当数据大小达到2G时将重置清零; 8.在获取数据包后可以针对某一IP或IP:PORT或IP/PORT及协议进行筛选,同时可以查阅当前所有的捕获的数据包(如果没有设置捕获前过滤,否则只能查阅过滤后的数据)。 二、安装环境说明:本应用的安装环境为Windows 7、Windows 8及Windows 8.1。 三、安装过程说明 1.在安装过程中需要获得管理员权限 - 捕获数据包需要访问底层数据,需要获得最高权限才可以正常运行该应用; 2.在安装结束时,用户可以选择此时启动应用还是结束安装流程;当选择此时启动时系统会再次提醒用户允许应用获取管理员权限-原因同上。 四、作者留言 该应用的开发环境为VS2013,所用语言为C#,界面设计属于WinForm(比较老式的界面风格,推荐使用WPF),在后期程序发布打包使用的是InstallShield Limited Edition(如果需要长期打包窗体应用发布最好购买正版,可以获得更多个性化的功能)。因本人水平有限,在该应用中不免存在很多漏洞和不足;如果你有更多更好的想法或者发现该小应用中的bug还望批评指正。 ||联系方式:LHearen@gmail.com|| 五、免责声明 本系统仅用于学习交流之用,本人不承担该应用的技术及版权问题,且不对该应用负法律责任。
—————————————————————— Hearen's SimpleSniffer —————————————————————— 一、功能简介: 1.针对同一局域网中的所有主机进行监听并返回处理优化后的数据供研究使用; 2.在数据表中显示了所有当前侦听到的数据包包括源IP、源端口、目的IP、目的端口、数据包协议类型、数据包捕获时间及数据包简略信息(仅应用层数据); 3.可以针对某一特定IP地址(源或目的),某特定端口(源或目的)以及特定类型数据包进行侦听 -- 捕获前过滤; 4.当数据过多时可以随时点击‘清理’对当前的数据表进行清空 -- 不过捕获的数据是不会被清除的,仅清除列表中显示的数据; 5.双击‘清理’时清空所有到的数据 -- 不仅仅是列表中显示的数据; 6.选择列表中的数据时,数据详细信息会显示在下方的面板中; 此时可以通过选择特定字符串来查看在其左侧的十六进制表示以供研究之用; 7.左下角会显示当前在该局域网中捕获到的数据包个数及总大小(该大小包含IP协议及其建立在该协议以上协议的头部)-- 数据单位会自动进行切换当数据大小达到2G时将重置清零; 8.在获取数据包后可以针对某一IP,PORT,IP:PORT或IP/PORT及协议进行筛选,同时可以查阅当前所有捕获的数据包(如果没有设置捕获前过滤,否则只能查阅过滤后的数据)。 二、使用说明:本应用的使用环境为Windows 7、Windows 8及Windows 8.1。 在使用过程中需要获得管理员权限 - 捕获数据包需要访问底层数据,需要获得最高权限才可以正常运行该应用; 三、作者留言 该应用的开发环境为VS2013,所用语言为C#,界面设计属于WinForm(比较老式的界面风格,推荐使用WPF)。因本人水平有限,在该应用中不免存在很多漏洞和不足;如果你有更多更好的想法或者发现该小应用中的bug还望批评指正。 ||联系方式:LHearen@126.com|| 四、免责声明 本系统仅用于学习交流之用,本人不承担该应用的技术及版权问题,且不对该应用负法律责任。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值