Beispiel #1
0
 private void capturePacket()
 {
     while (packetCount < maxPackets)
     {
         byte[] packet = driver.RecievePacket();
         capturedPackets[packetCount] = packet;
         packetCount++;
     }
 }
Beispiel #2
0
        /// <summary>
        ///		Resolve a physical address to an IP address.
        /// </summary>
        /// <param name="address">
        ///		The physical address to resolve.
        ///	</param>
        /// <returns>
        ///		Returns the IP address belonging to the physical address.
        ///	</returns>
        /// <exception cref="ObjectDisposedException">
        ///		If the object has already been disposed then an ObjectDisposedException
        ///		will be thrown
        ///	</exception>
        /// <exception cref="Exception">
        ///		If the driver failed to start or was not bound, an exception will be thrown.
        ///	</exception>
        public IPAddress ResolveMACAddress(MACAddress address)
        {
            if (m_disposed)
            {
                throw new ObjectDisposedException(this.ToString());
            }

            if (!m_driver.DriverStarted)
            {
                throw new Exception("The driver has not been started.");
            }

            if (!m_driver.DriverBound)
            {
                throw new Exception("The driver has not yet been bound to a device.");
            }

            Ethernet802_3 ethernet = new Ethernet802_3();

            // construct the ethernet header
            ethernet.SourceMACAddress      = m_driver.BoundAdapter.MediaAccessControlAddress;
            ethernet.DestinationMACAddress = MACAddress.BroadcastAddress;
            ethernet.NetworkProtocol       = NetworkLayerProtocol.ARP;

            ArpPacket arp = new ArpPacket();

            // construct the ARP header
            arp.Type                  = ArpOpcode.ReverseRequest;
            arp.Protocol              = NetworkLayerProtocol.IP;
            arp.MediaType             = MediaType.Ethernet;
            arp.SourceMACAddress      = ethernet.SourceMACAddress;
            arp.SourceIPAddress       = m_driver.BoundAdapter.Interfaces[0].Address;
            arp.DestinationMACAddress = address;

            // serialize and send the packet
            ethernet.Data = arp.Serialize();
            m_driver.SendPacket(ethernet.Serialize());

            m_querying = true;

            // wait for the reply
            while (m_querying)
            {
                byte[] packet = m_driver.RecievePacket();

                Ethernet802_3 ethReply = new Ethernet802_3(packet);

                // if this is an ARP packet
                if (ethReply.NetworkProtocol == NetworkLayerProtocol.ARP)
                {
                    ArpPacket arpReply = new ArpPacket(ethReply.Data);

                    // if this is an ARP reply
                    if (arpReply.Type == ArpOpcode.Reply)
                    {
                        // if the address matches the one we requested
                        if (arpReply.DestinationIPAddress.Equals(address))
                        {
                            // return the IP address
                            return(arpReply.DestinationIPAddress);
                        }
                    }
                }
            }

            return(IPAddress.Any);
        }