public static byte[] GetBytes(this DhcpPacket packet, IDhcpPacketSerializer serializer) { using (MemoryStream ms = new MemoryStream()) using (BinaryWriter br = new BinaryWriter(ms)) { serializer.Serialize(br, packet); return(ms.ToArray()); } }
public async Task <IReadOnlyList <DhcpPacket> > Discover(DhcpDiscoveryParameters parameters, CancellationToken ct) { var results = new List <DhcpPacket>(); var transactionId = GenerateTransactionId(); void ReceptionCallback(object sender, DhcpPacketEventArgs args) { HandleDhcpResponseReceived(results, args, transactionId); } _dhcpListener.PacketReceived += ReceptionCallback; _dhcpListener.StartIfNotRunning(); using (var udpClient = new UdpClient()) { var broadcastPacket = CreateBroadcastPacket(parameters, transactionId); var broadcastPacketBytes = _serializer.Serialize(broadcastPacket); _logger.LogDebug("Sending broadcast DHCP Packet for transaction {0}", transactionId); await udpClient .SendAsync(broadcastPacketBytes, broadcastPacketBytes.Length, BroadcastEndpoint) .WithCancellation(ct) .ConfigureAwait(false); } await Task.Delay(parameters.Timeout, ct).ConfigureAwait(false); _dhcpListener.PacketReceived -= ReceptionCallback; if (results.Count == 0) { throw new TimeoutException($"No DHCP response recieved for transaction {transactionId}."); } return(results); }