//共通メソッド //リソースレコードのtostring() private string print(OneRr o) { switch (o.DnsType){ case DnsType.A: return o.ToString(); case DnsType.Aaaa: return o.ToString(); case DnsType.Ns: return o.ToString(); case DnsType.Mx: return o.ToString(); case DnsType.Ptr: return o.ToString(); case DnsType.Soa: return o.ToString(); case DnsType.Cname: return o.ToString(); default: Util.RuntimeException("not implement."); break; } return ""; }
//レスポンス情報追加をまとめて記述 private void AppendRr(PacketDns packetDns, RrKind rrKind, OneRr oneRr) { Logger.Set(LogKind.Detail, null, 23, string.Format("[{0}] {1}", rrKind, oneRr)); //"Append RR" packetDns.AddRr(rrKind, oneRr); }
//回答フィールドへの追加 //これを下記のように変更し、OneRRのコンストラクタを使用するようにする public void AddRr(RrKind rrKind, OneRr oneRr) { //名前の圧縮は、最後のgetBytes()で処理する var i = (int) rrKind; _ar[i].Add(oneRr); try{ var count = _dnsHeader.GetCount(i); _dnsHeader.SetCount(i, ++count); } catch (IOException){ Util.RuntimeException("PacketDns.addRR()"); } }
//リソースの追加 //同一のリソース(TTL以外)は上書きされる //ただしTTL=0のデータは上書きされない public bool Add(OneRr oneRr) { // 排他制御 lock (this){ OneRr target = null; //書き換え対象のリソース //TTL以外が全て同じのソースを検索する foreach (var o in _ar){ if (o.DnsType == oneRr.DnsType && o.Name == oneRr.Name){ //データ内容の確認 var isSame = !o.Data.Where((t, n) => t != oneRr.Data[n]).Any(); if (isSame){ if (o.Ttl == 0){ //TTL=0のデータは普遍であるため、書き換えはしない return false; } target = o; break; } } } //書き換えの対象が見つかっている場合は、削除する if (target != null){ _ar.Remove(target); } _ar.Add(oneRr); } return true; }