//преобразование имени //доменное имя, есть набор подимен //парсер должен сделать следующее //1. прочитать имя и разбить на зоны //2. найти максимальное подимя в дереве суффиксов //3. заменить его на ссылку //4. остальное написать public static byte[] GenerateName(string name, int addr, SuffixTree names) { var bytes = new List <byte>(); var codes = GenerateZones(name); int reference = 0; int suffix = suffix = names.ReadNameAndUpdate(name, ref reference, addr); foreach (var bs in codes) { bytes.Add((byte)bs.Length); bytes.AddRange(bs); } if (suffix > 0) { bytes.RemoveRange(bytes.Count - suffix, suffix); bytes.AddRange(To2Bytes(192 * 256 + reference)); } return(bytes.ToArray()); }
public static byte[] GenerateRequest(Question quest, short id, SuffixTree names) { var request = new List <byte>(); request.AddRange(To2Bytes(id)); request.Add(1); //0... - request, .0000... - opcode (std. query), ...0.. - isn't truncated, ...0. - in't fragmented, ...1 - recursion request.Add(0); //0... - server supports recursion, .000... - reserved, ...0000 - RCODE (NOError) request.AddRange(To2Bytes(1)); //questions count request.AddRange(To2Bytes(0)); //answers count request.AddRange(To2Bytes(0)); //authoritive RRs count request.AddRange(To2Bytes(0)); //additional RRs count //simple single question int trash = 0; names.ReadNameAndUpdate(quest.Domain, ref trash, request.Count); request.AddRange(EncodeDName(quest.Domain)); //name request.AddRange(To2Bytes((int)quest.Type)); //Type request.AddRange(To2Bytes(1)); //Class (IN) return(request.ToArray()); }