你的位置:首页 > 软件开发 > ASP.net > C#的Raw Socket实现网络封包监视

C#的Raw Socket实现网络封包监视

发布时间:2016-06-01 18:00:16
同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本机的IP包,通过原始套接字,我们也可以更加自如地控制Windows下的多种协议, ...

同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本机的IP包,通过原始套接字,我们也可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。  在本文例子中,nbyte.BasicClass命名空间实现了RawSocket类,它包含了我们实现数据包监视的核心技术。在实现这个类之前,需要先写一个IP头结构,来暂时存放一些有关网络封包的信息:

[StructLayout(LayoutKind.Explicit)] 下面就开始写RawSocket类了,一开始,先定义几个参数,包括: 

private bool error_occurred; //套接字在接收包时是否产生错误 

const int SIO_RCVALL = unchecked((int)0x98000001);//监听所有的数据包

public RawSocket() //构造函数 

public void CreateAndBindSocket(get='_blank'>string IP) //建立并绑定套接字   if (SetSocketOption()==false) error_occurred=true; 

socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

第一个参数是设定地址族,MSDN上的描述是“指定 Socket 实例用来解析地址的寻址方案”,当要把套接字绑定到终结点(IPEndPoint)时,需要使用InterNetwork成员,即采用IP版本4的地址格式,这也是当今大多数套接字编程所采用一个寻址方案(AddressFamily)。 第二个参数设置的套接字类型就是我们使用的Raw类型了,SocketType是一个枚举数据类型,Raw套接字类型支持对基础传输协议的访问。通过使用 SocketType.Raw,你不光可以使用传输控制协议(Tcp)和用户数据报协议(Udp)进行通信,也可以使用网际消息控制协议 (Icmp) 和 Internet 组管理协议 (Igmp) 来进行通信。在发送时,您的应用程序必须提供完整的 IP 标头。所接收的数据报在返回时会保持其 IP 标头和选项不变。 第三个参数设置协议类型,Socket 类使用 ProtocolType 枚举数据类型向 Windows Socket API 通知所请求的协议。这里使用的是IP协议,所以要采用ProtocolType.IP参数。 在CreateAndBindSocket函数中有一个自定义的SetSocketOption函数,它和Socket类中的SetSocketOption不同,我们在这里定义的是具有IO控制功能的SetSocketOption,它的定义如下: 

private bool SetSocketOption() //设置raw socket    //低级别操作模式,接受所有的数据包,这一步是关键,必须把socket设成raw和IP Level才可用  SIO_RCVALL 

int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT);

int WSAIoctl( 因为设置套接字选项时可能会发生错误,需要用一个值传递错误标志: 

public bool ErrorOccurred   PacketArrivedEventArgs e=new PacketArrivedEventArgs();//新网络数据包信息事件   fixed(byte *fixed_buf = buf)    temp_protocol = head->ip_protocol;    temp_version =(uint)(head->ip_verlen & 0xF0) >> 4;//提取IP协议版本    //以下语句提取出了PacketArrivedEventArgs对象中的其他参数    temp_srcport = *(short *)&fixed_buf[e.HeaderLength];    e.PacketLength =(uint)len;    e.ReceiveBuffer=buf; 

public void Run() //开始监听 

private void CallReceive(IAsyncResult ar)//异步回调 下面通过声明代理事件句柄来实现和外界的通信: 

public delegate void PacketArrivedEventHandler(Object sender, PacketArrivedEventArgs args); 

public void Shutdown() //关闭raw socket 

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:C#的Raw Socket实现网络封包监视

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录