diff --git a/apps/sdlan/src/dns_proxy/dns_handler.erl b/apps/sdlan/src/dns_proxy/dns_handler.erl index a984c9a..fa605d2 100644 --- a/apps/sdlan/src/dns_proxy/dns_handler.erl +++ b/apps/sdlan/src/dns_proxy/dns_handler.erl @@ -126,7 +126,7 @@ resolver(Packet) when is_binary(Packet) -> resolver0(Packet, dns:decode_message(Packet)). resolver0(Packet, QueryMsg = #dns_message{qc = 1, questions = [Question = #dns_query{name = QName, type = QType, class = QClass}|_]}) -> %% 查找是否是内置的域名 - case sdlan_dns_resolver:resolve(QName) of + case sdlan_hostname_regedit:lookup(QName) of {ok, Ip} -> Answer = #dns_rr { name = QName, diff --git a/apps/sdlan/src/sdlan_app.erl b/apps/sdlan/src/sdlan_app.erl index 2617106..acfc0cb 100644 --- a/apps/sdlan/src/sdlan_app.erl +++ b/apps/sdlan/src/sdlan_app.erl @@ -16,6 +16,9 @@ start(_StartType, _StartArgs) -> %% 加速内存的回收 erlang:system_flag(fullsweep_after, 16), + %% 启动注册表 + sdlan_hostname_regedit:init(), + start_http_server(), start_tcp_server(), sdlan_sup:start_link(). diff --git a/apps/sdlan/src/sdlan_dns_resolver.erl b/apps/sdlan/src/sdlan_dns_resolver.erl deleted file mode 100644 index 32c8759..0000000 --- a/apps/sdlan/src/sdlan_dns_resolver.erl +++ /dev/null @@ -1,24 +0,0 @@ -%%%------------------------------------------------------------------- -%%% @author anlicheng -%%% @copyright (C) 2025, -%%% @doc -%%% -%%% @end -%%% Created : 13. 12月 2025 15:44 -%%%------------------------------------------------------------------- --module(sdlan_dns_resolver). --author("anlicheng"). - -%% API --export([resolve/1]). - --spec resolve(QName :: binary()) -> {ok, IpAddr :: inet:ip4_address()} | error. -resolve(QName) when is_binary(QName) -> - Suffix = <<".punchnet.ts.net">>, - case dns_utils:ends_with(QName, Suffix) of - true -> - Ip4 = rand:uniform(254), - {ok, {192, 168, 1, Ip4}}; - false -> - error - end. \ No newline at end of file diff --git a/apps/sdlan/src/sdlan_hostname_regedit.erl b/apps/sdlan/src/sdlan_hostname_regedit.erl new file mode 100644 index 0000000..2ee7c30 --- /dev/null +++ b/apps/sdlan/src/sdlan_hostname_regedit.erl @@ -0,0 +1,32 @@ +%%%------------------------------------------------------------------- +%%% @author anlicheng +%%% @copyright (C) 2025, +%%% @doc +%%% 内部地址协议注册表 +%%% @end +%%% Created : 13. 12月 2025 21:09 +%%%------------------------------------------------------------------- +-module(sdlan_hostname_regedit). +-author("anlicheng"). + +%% API +-export([init/0, lookup/1, insert/2]). + +-define(TABLE, sdlan_hostname_regedit). + +init() -> + ets:new(?TABLE, [named_table, set, public, {read_concurrency, true}, {write_concurrency, true}]). + +-spec lookup(FullHostname :: binary()) -> error | {ok, Ip :: inet:ip4_address()}. +lookup(FullHostname) when is_binary(FullHostname) -> + case ets:lookup(?TABLE, FullHostname) of + [{_, Ip}] -> + {ok, Ip}; + [] -> + error + end. + +-spec insert(FullHostname :: binary(), Ip :: integer()) -> no_return(). +insert(FullHostname, Ip) when is_integer(FullHostname) -> + <> = <>, + true = ets:insert(?TABLE, {FullHostname, {Ip0, Ip1, Ip2, Ip3}}). \ No newline at end of file diff --git a/apps/sdlan/src/sdlan_network.erl b/apps/sdlan/src/sdlan_network.erl index 39f3175..6190d37 100644 --- a/apps/sdlan/src/sdlan_network.erl +++ b/apps/sdlan/src/sdlan_network.erl @@ -231,6 +231,10 @@ handle_call({assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr0, HostName}, _Fr %% 关闭之前的channel maybe_close_channel(maps:get(Mac, UsedMap, undefined)), + %% 添加域名->ip的映射关系 + FullHostname = <>, + sdlan_hostname_regedit:insert(FullHostname, Ip), + %% 建立到新的channel之间的关系 MRef = monitor(process, ChannelPid), NUsedMap = maps:put(Mac, #host{client_id = ClientId, channel_pid = ChannelPid, monitor_ref = MRef}, UsedMap),