public IgmpDisplayPacket(IpV4Header ipHeader, IgmpHeader igmpHeader) { Destination = ipHeader.DestinationAddress; //DestinationPort = udpHeader.DestinationPort; Source = ipHeader.SourceAddress; //SourcePort = udpHeader.SourcePort; Type = ipHeader.ProtocolType; StringBuilder retVal = new StringBuilder(); AppendIcmp(igmpHeader, retVal); AppendIPInfo(ipHeader, retVal); Data = retVal.ToString(); }
/// <summary> /// This routine creates an instance of the IgmpHeader class from a byte /// array that is a received IGMP packet. This is useful when a packet /// is received from the network and the header object needs to be /// constructed from those values. /// </summary> /// <param name="igmpPacket">Byte array containing the binary IGMP header</param> /// <param name="bytesCopied">Number of bytes used in header</param> /// <returns>Returns the IgmpHeader object created from the byte array</returns> static public IgmpHeader Create(byte[] igmpPacket, ref int bytesCopied) { IgmpHeader igmpHeader = new IgmpHeader(); int offset = 0; // Verify byte array is large enough to contain IGMP header if (igmpPacket.Length < IgmpHeader.IgmpHeaderLength) { return(null); } igmpHeader.igmpVersionType = igmpPacket[offset++]; igmpHeader.igmpMaxResponseTime = igmpPacket[offset++]; igmpHeader.igmpChecksum = BitConverter.ToUInt16(igmpPacket, offset); bytesCopied = IgmpHeader.IgmpHeaderLength; return(igmpHeader); }
/// <summary> /// /// </summary> /// <param name="ipFrom"></param> public static void IgmpQuery(string ipFrom) { try { ArrayList headerList = new ArrayList(); Ipv4Header ipv4Header = new Ipv4Header() { Version = 4, Protocol = (Byte)ProtocolType.Igmp, Ttl = 1, Offset = 0, Length = 20, TotalLength = (ushort)Convert.ToUInt16(IgmpHeader.IgmpHeaderLength /* + padByteCount*/), SourceAddress = IPAddress.Parse(ipFrom), DestinationAddress = IgmpHeader.AllSystemsAddress }; IgmpHeader igmpHeader = new IgmpHeader() { VersionType = IgmpHeader.IgmpMembershipQuery, MaximumResponseTime = 10, GroupAddress = IPAddress.Parse("0.0.0.0") }; headerList.Add(ipv4Header); headerList.Add(igmpHeader); Byte[] igmpPacket = igmpHeader.BuildPacket(headerList, new Byte[] { }); Socket igmpSocket = new Socket(IPAddress.Parse("0.0.0.0").AddressFamily, SocketType.Raw, ProtocolType.Igmp); igmpSocket.Bind(new IPEndPoint(IPAddress.Parse(ipFrom), 0)); igmpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1); igmpSocket.SendTo(igmpPacket, new IPEndPoint(IgmpHeader.AllSystemsAddress, 0)); } catch (Exception x) { LogManager.GetCurrentClassLogger().Log(LogLevel.Error, "Excepcion: " + x.Message, x); } }
/// <summary> /// This routine creates an instance of the IgmpHeader class from a byte /// array that is a received IGMP packet. This is useful when a packet /// is received from the network and the header object needs to be /// constructed from those values. /// </summary> /// <param name="igmpPacket">Byte array containing the binary IGMP header</param> /// <param name="bytesCopied">Number of bytes used in header</param> /// <returns>Returns the IgmpHeader object created from the byte array</returns> public static IgmpHeader Create(byte[] igmpPacket, ref int bytesCopied) { IgmpHeader igmpHeader = new IgmpHeader(); int offset = 0; // Verify byte array is large enough to contain IGMP header if (igmpPacket.Length < IgmpHeader.IgmpHeaderLength) return null; igmpHeader.igmpVersionType = igmpPacket[offset++]; igmpHeader.igmpMaxResponseTime = igmpPacket[offset++]; igmpHeader.igmpChecksum = BitConverter.ToUInt16(igmpPacket, offset); bytesCopied = IgmpHeader.IgmpHeaderLength; return igmpHeader; }
private void AppendIcmp(IgmpHeader igmpHeader, StringBuilder retVal) { retVal.AppendFormat("[*IGMP* MaxRespCode:{0}, ", igmpHeader.MaxRespCode); retVal.AppendFormat("Type:{0}] ", igmpHeader.Type); }
/// <summary> /// This function parses the incoming packets and extracts the data based upon /// the protocol being carried by the IP datagram. /// </summary> /// <param name="byteData">Incoming bytes</param> /// <param name="nReceived">The number of bytes received</param> private IPDisplayPacket GetDisplayPacket(IpV4Header ipHeader) { IPDisplayPacket retVal; // Since all protocol packets are encapsulated in the IP datagram // so we start by parsing the IP header and see what protocol data // is being carried by it. // Now according to the protocol being carried by the IP datagram we parse // the data field of the datagram. switch (ipHeader.ProtocolType) { case Protocol.TCP: { TcpHeader tcpHeader = new TcpHeader(ipHeader.Data, ipHeader.MessageLength); retVal = new TCPDisplayPacket(ipHeader, tcpHeader); } break; case Protocol.UDP: { UdpHeader udpHeader = new UdpHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new UDPDisplayPacket(ipHeader, udpHeader); } break; case Protocol.ICMP: { IcmpHeader icmpHeader = new IcmpHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new IcmpDisplayPacket(ipHeader, icmpHeader); } break; case Protocol.IGMP: { IgmpHeader igmpHeader = new IgmpHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new IgmpDisplayPacket(ipHeader, igmpHeader); } break; case Protocol.DCCP: { DCCPHeader icmpHeader = new DCCPHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new DCCPDisplayPacket(ipHeader, icmpHeader); } break; case Protocol.EIGRP: { EIGRPHeader icmpHeader = new EIGRPHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new EIGRPDisplayPacket(ipHeader, icmpHeader); } break; case Protocol.GREs: { GREHeader icmpHeader = new GREHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new GREDisplayPacket(ipHeader, icmpHeader); } break; case Protocol.OSPF: { OSPFHeader icmpHeader = new OSPFHeader(ipHeader.Data, (int)ipHeader.MessageLength); retVal = new OSPFDisplayPacket(ipHeader, icmpHeader); } break; default: case Protocol.Unknown: retVal = new IPDisplayPacket(ipHeader); break; } return(retVal); }