修改dns的继续逻辑

This commit is contained in:
anlicheng 2026-02-24 15:36:13 +08:00
parent 6a044f155f
commit 2f7373b69b

View File

@ -90,7 +90,7 @@ resolver0(Packet, QueryMsg = #dns_message{qc = 1, questions = [Question = #dns_q
RespMsg = build_response(QueryMsg, Cache), RespMsg = build_response(QueryMsg, Cache),
{ok, dns:encode_message(RespMsg)}; {ok, dns:encode_message(RespMsg)};
miss -> miss ->
case forward_to_upstream(Packet, QueryMsg) of case forward_to_upstream(Packet) of
{ok, Resp} -> {ok, Resp} ->
case dns:decode_message(Resp) of case dns:decode_message(Resp) of
RespMsg = #dns_message{answers = Answers} -> RespMsg = #dns_message{answers = Answers} ->
@ -182,22 +182,21 @@ build_ip_packet(SAddr, DAddr, SPort, DPort, UdpPayload) when is_integer(SPort),
<<IpHeader/binary, IpPayload/binary>>. <<IpHeader/binary, IpPayload/binary>>.
-spec forward_to_upstream(Request :: binary(), QueryMsg :: #dns_message{}) -> no_return(). -spec forward_to_upstream(Request :: binary()) -> {ok, Resp :: binary()} | {error, Reason :: any()}.
forward_to_upstream(Request, #dns_message{id = TxId, questions = [#dns_query{name = QName, type = QType, class = QClass}|_]}) -> forward_to_upstream(Request) ->
{ok, {DnsIp, DnsPort}} = application:get_env(sdlan, public_dns_server), {DnsIp, DnsPort} = select_dns_server(),
{ok, Socket} = gen_udp:open(0, [binary, {active, true}]), {ok, Socket} = gen_udp:open(0, [binary, {active, true}]),
ok = gen_udp:send(Socket, DnsIp, DnsPort, Request), ok = gen_udp:send(Socket, DnsIp, DnsPort, Request),
logger:debug("[dns_resolver] send to: ~p, packet: ~p", [{DnsIp, DnsPort}, Request]), logger:debug("[dns_resolver] send to: ~p, packet: ~p", [{DnsIp, DnsPort}, Request]),
receive receive
{udp, Socket, DnsIp, DnsPort, Resp} -> {udp, Socket, DnsIp, DnsPort, Resp} ->
try dns:decode_message(Resp) of {ok, Resp}
#dns_message{id = TxId, questions = [#dns_query{name = QName, type = QType, class = QClass}|_]} ->
{ok, Resp};
_ ->
{error, invalid_dns_response}
catch error:Err ->
{error, Err}
end
after 2000 -> after 2000 ->
{error, timeout} {error, timeout}
end. end.
-spec select_dns_server() -> {DnsIp :: inet:ip4_address(), DnsPort :: pos_integer()}.
select_dns_server() ->
{ok, DnsServers} = application:get_env(sdlan, public_dns_server),
Idx = rand:uniform(length(DnsServers)),
lists:nth(Idx, DnsServers).