Возвращаясь к теме Снифер на C#
Добавлю разбор пакетов по протоколам ICMP и IGMP
Приведенные ниже классы являются частью открытого проекта NetworkShow (https://code.google.com/p/networkshow/)
Для IGMP:
public enum IGMPMessageType { MembershipQuery = 17, MembershipReportIGMPv1 = 18, MembershipReportIGMPv2 = 22, LeaveGroup = 23, MembershipReportIGMPv3 = 34, } class IGMPHeader { private byte versionType; private byte unused; private ushort checkSum; private uint groupAddress; public IGMPHeader(byte[] byBuffer, int nReceived) { MemoryStream memoryStream = new MemoryStream(byBuffer, 0, nReceived); BinaryReader binaryReader = new BinaryReader(memoryStream); versionType = (byte)binaryReader.ReadByte(); unused = (byte)IPAddress.NetworkToHostOrder(binaryReader.ReadByte()); checkSum = (ushort)IPAddress.NetworkToHostOrder(binaryReader.ReadInt16()); //groupAddress = (uint)IPAddress.NetworkToHostOrder(binaryReader.ReadInt32()); groupAddress = (uint)binaryReader.ReadInt32(); } public IGMPMessageType Type { get { return (IGMPMessageType)versionType; } } public string Version { get { byte tmp = versionType; tmp = tmp >>= 4; return Convert.ToString(tmp); } } public string Checksum { get { return string.Format("0x{0:x2}", checkSum); } } public IPAddress GroupAddress { get { return new IPAddress(groupAddress); } } }
Для ICMP:
public enum ICMPv4TypeCodes { EchoReply = 0, Unassigned1 = 256, Unassigned2 = 512, Unreachable_Net = 768, Unreachable_Host = 769, Unreachable_Protocol = 770, Unreachable_Port = 771, Unreachable_FragmentationNeeded = 772, Unreachable_SourceRouteFailed = 773, Unreachable_DestinationNetworkUnknown = 774, Unreachable_DestinationHostUnknown = 775, Unreachable_SourceHostIsolated = 776, Unreachable_NetworkProhibited = 777, Unreachable_HostProhibited = 778, Unreachable_NetworkUnreachableForServiceType = 779, Unreachable_HostUnreachableForServiceType = 780, Unreachable_CommunicationProhibited = 781, Unreachable_HostPrecedenceViolation = 782, Unreachable_PrecedenceCutoffInEffect = 783, SourceQuench = 1024, AlternateHostAddress = 1280, Redirect_Network = 1280, Redirect_Host = 1281, Redirect_TypeOfServiceAndNetwork = 1282, Redirect_TypeOfServiceAndHost = 1283, Unassigned3 = 1792, EchoRequest = 2048, RouterAdvertisement = 2304, RouterSelection = 2560, TimeExceeded = 2816, Param_PointerIndicatesError = 3072, Param_MissingRequiredOption = 3073, Param_BadLength = 3074, Timestamp = 3328, TimestampReply = 3584, InformationRequest = 3840, InformationReply = 4096, AddressMaskRequest = 4352, AddressMaskReply = 4608, Reserved4Security = 4864, Reserved4robustnessExperiment1 = 5120, Reserved4robustnessExperiment2 = 5376, Reserved4robustnessExperiment3 = 5632, Reserved4robustnessExperiment4 = 5888, Reserved4robustnessExperiment5 = 6144, Reserved4robustnessExperiment6 = 6400, Reserved4robustnessExperiment7 = 6656, Reserved4robustnessExperiment8 = 6912, Reserved4robustnessExperiment9 = 7168, Reserved4robustnessExperiment10 = 7424, Traceroute = 7680, DatagramConversionError = 7936, MobileHostRedirect = 8192, IPv6WhereAreYou = 8448, IPv6IAmHere = 8704, MobileReqistrationRequest = 8960, MobileRegistrationReply = 9216, Skip = 9472, Photuri_BadSPI = 9728, Photuri_AuthenticationFailed = 9729, Photuri_DecompressionFailed = 9730, Photuri_DecryptionFailed = 9731, Photuri_NeedAuthentication = 9732, Photuri_NeedAuthorization = 9733, } class ICMPHeader { // private byte type; // private byte cod; private ushort type; private ushort checkSum; public ICMPHeader(byte[] byBuffer, int nReceived) { MemoryStream memoryStream = new MemoryStream(byBuffer, 0, nReceived); BinaryReader binaryReader = new BinaryReader(memoryStream); // type = (byte)binaryReader.ReadByte(); // cod = (byte)IPAddress.NetworkToHostOrder(binaryReader.ReadByte()); type = (ushort)IPAddress.NetworkToHostOrder(binaryReader.ReadInt16()); checkSum = (ushort)IPAddress.NetworkToHostOrder(binaryReader.ReadInt16()); } public ICMPv4TypeCodes Type { get { return (ICMPv4TypeCodes)type; } } }