Inheritance: AProtocolHeader
        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);
            }
        }
Example #4
0
    /// <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);
 }
Example #6
0
        /// <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);
        }