Answers
winsock2最明显的就是支持了raw socket套接字类型,使用raw socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的ip包,当然包括目的不是本机的ip包,通过原始套接字,我们也可以更加自如地控制windows下的多种协议,而且能够对网络底层的传输机制进行控制。
在本文例子中,我在nbyte.basicclass命名空间实现了rawsocket类,它包含了我们实现数据包监视的核心技术。在实现这个类之前,需要先写一个ip头结构,来暂时存放一些有关网络封包的信息:
[structlayout(layoutkind.explicit)]
public struct ipheader
{
[fieldoffset(0)] public byte ipverlen; //i4位首部长度+4位ip版本号
[fieldoffset(1)] public byte iptos; //8位服务类型tos
[fieldoffset(2)] public ushort iptotallength; //16位数据包总长度(字节)
[fieldoffset(4)] public ushort ipid; //16位标识
[fieldoffset(6)] public ushort ipoffset; //3位标志位
[fieldoffset(8)] public byte ipttl; //8位生存时间 ttl
[fieldoffset(9)] public byte ipprotocol; //8位协议(tcp, udp, icmp, etc.)
[fieldoffset(10)] public ushort ipchecksum; //16位ip首部校验和
[fieldoffset(12)] public uint ip_srcaddr; //32位源ip地址