public async Task <DnsAnswer> Query(DnsHeader query, CancellationToken token) { var raw = DnsByteExtensions.ToBytes(query).ToArray(); var payload = DnsByteExtensions.ToBytes((ushort)raw.Length).Concat(raw).ToArray(); var stream = _socket.GetStream(); await stream.WriteAsync(payload, 0, payload.Length, token); var buffer = new byte[4096]; var receive = await stream.ReadAsync(buffer, 0, buffer.Length, token); stream.Close(); var offset = 0; var responseLength = DnsByteExtensions.ReadUInt16(buffer, ref offset); var response = DnsByteExtensions.ReadBytes(buffer, responseLength, ref offset); if (response.Length != responseLength) { throw new InvalidOperationException(); } return(DnsByteExtensions.FromBytes <DnsAnswer>(response)); }
/// <inheritdoc/> public void ReadBytes(byte[] bytes, ref int offset, int length) { Preference = DnsByteExtensions.ReadUInt16(bytes, ref offset); Exchange = string.Join(".", DnsByteExtensions.ReadString(bytes, ref offset)); }