private void SendPacket(DhcpMessageType dhcpMessageType, DhcpPacket responsePacket, IPAddress address, int port) { Console.WriteLine("{0:X8}: Sending packet type {1} to {2}:{3}", responsePacket.xid, dhcpMessageType, address, port); responsePacket.Options.SetByte(DhcpPacketOptionId.DhcpMessageType, (Byte)dhcpMessageType); var broadcast = address == IPAddress.Broadcast; responsePacket.flags = (UInt16)(broadcast ? 0x8000 : 0x0000); var bytes = responsePacket.ToArray(); DhcpPacket.TraceToFile(bytes); var endPoint = new IPEndPoint(address, port); SendData(bytes, endPoint); Console.WriteLine("{0:X8}: Packet sent", responsePacket.xid); }
protected override void ProcessRequest(IPEndPoint remoteEndPoint, Byte[] data, int dataLength) { DhcpPacket.TraceToFile(data); var dhcpPacket = new DhcpPacket(data, dataLength); Console.WriteLine("{0:X8}: *** DHCP packet type {1} received on port {2}", dhcpPacket.xid, dhcpPacket.MessageType, Port); var vendorClassIdentifier = dhcpPacket.VendorClassIdentifier; if (String.IsNullOrEmpty(vendorClassIdentifier) || !vendorClassIdentifier.StartsWith("PXEClient")) { Console.WriteLine("{0:X8}: Not a BOOTP request", dhcpPacket.xid); return; } PacketReceived(this, dhcpPacket); switch (dhcpPacket.MessageType) { case DhcpMessageType.DhcpDiscover: ProcessDiscoverRequest(dhcpPacket); break; case DhcpMessageType.DhcpRequest: if (Port != 4011) { Console.WriteLine("{0:X8}: Not a BOOTP request", dhcpPacket.xid); return; } ProcessRequestRequest(dhcpPacket); break; default: Console.WriteLine("{0:X8}: Message type not handled", dhcpPacket.xid); break; } }