/// <summary> /// DHCP handler. /// </summary> /// <param name="packetData">Packet data.</param> /// <exception cref="OverflowException">Thrown if UDP_Data array length is greater than Int32.MaxValue.</exception> /// <exception cref="sysIO.IOException">Thrown on IO error.</exception> public static void DHCPHandler(byte[] packetData) { var dhcp_packet = new DHCPPacket(packetData); var receiver = UdpClient.GetClient(dhcp_packet.DestinationPort); if (receiver != null) { receiver.ReceiveData(dhcp_packet); } }
/// <summary> /// Receive data /// </summary> /// <param name="timeout">timeout value, default 5000ms</param> /// <returns>time value (-1 = timeout)</returns> /// <exception cref="InvalidOperationException">Thrown on fatal error (contact support).</exception> private int Receive(int timeout = 5000) { int second = 0; int _deltaT = 0; while (rxBuffer.Count < 1) { if (second > (timeout / 1000)) { return(-1); } if (_deltaT != RTC.Second) { second++; _deltaT = RTC.Second; } } var packet = new DHCPPacket(rxBuffer.Dequeue().RawData); if (packet.MessageType == 2) //Boot Reply { if (packet.RawData[284] == 0x02) //Offer packet received { Global.mDebugger.Send("Offer received."); return(SendRequestPacket(packet.Client)); } else if (packet.RawData[284] == 0x05 || packet.RawData[284] == 0x06) //ACK or NAK DHCP packet received { var ack = new DHCPAck(packet.RawData); if (asked) { Apply(ack, true); } else { Apply(ack); } } } return(second); }