/// <summary>处理请求</summary> /// <param name="session"></param> /// <param name="request"></param> /// <returns></returns> protected virtual DNSEntity Request(INetSession session, DNSEntity request) { var local = session.Session.Local; var isTcp = local.IsTcp; // 处理,修改 WriteLog("{0} 请求 {1}", session.Session.Remote, request); // 请求事件,如果第二参数有值,则直接返回 // 结合数据库缓存,可以在这里进行返回 if (OnRequest != null) { var e = new DNSEventArgs { Request = request }; OnRequest(this, e); if (e.Response != null) { return(e.Response); } } // 如果是PTR请求 var rq = request.Questions[0]; if (rq.Type == DNSQueryType.PTR) { var ptr = RequestPTR(request); if (ptr != null) { return(ptr); } } // 读取缓存 //var rs = cache.GetItem(request.ToString(), k => GetDNS(k, request)); var key = request.ToString(); var rs = cache[key]; if (rs == null) { cache[key] = rs = GetDNS(key, request); } // 返回给客户端 if (rs != null) { // 如果是PTR请求 if (rq.Type == DNSQueryType.PTR && rs.Questions[0].Type == DNSQueryType.PTR) { var ptr = rq as DNS_PTR; if (rs.GetAnswer() is DNS_PTR ptr2) { ptr2.Name = ptr.Name; ptr2.DomainName = DomainName; } if (rs.Answers != null && rs.Answers.Length > 0) { foreach (var item in rs.Answers) { if (item.Type == DNSQueryType.PTR) { item.Name = ptr.Name; } } } } } return(rs); }
/// <summary>处理请求</summary> /// <param name="session"></param> /// <param name="request"></param> /// <returns></returns> protected virtual DNSEntity Request(ISocketSession session, DNSEntity request) { var isTcp = session.Local.IsTcp; // 处理,修改 WriteLog("{0} 请求 {1}", session.Local.Type, request); // 请求事件,如果第二参数有值,则直接返回 // 结合数据库缓存,可以在这里进行返回 if (OnRequest != null) { var e = new DNSEventArgs(); e.Request = request; OnRequest(this, e); if (e.Response != null) { return(e.Response); } } // 如果是PTR请求 if (request.IsPTR) { var ptr = RequestPTR(request); if (ptr != null) { return(ptr); } } // 读取缓存 var rs = cache.GetItem <DNSEntity>(request.ToString(), request, GetDNS); // 返回给客户端 if (rs != null) { // 如果是PTR请求 if (request.IsPTR && rs.IsPTR) { var ptr = request.Questions[0] as DNS_PTR; var ptr2 = rs.GetAnswer() as DNS_PTR; if (ptr2 != null) { ptr2.Name = ptr.Name; ptr2.DomainName = DomainName; } if (rs.Answers != null && rs.Answers.Length > 0) { foreach (var item in rs.Answers) { if (item.Type == DNSQueryType.PTR) { item.Name = ptr.Name; } } } } } return(rs); }