增加域名解析
This commit is contained in:
parent
1b069ba63c
commit
6d2f9d52c3
@ -126,7 +126,7 @@ resolver(Packet) when is_binary(Packet) ->
|
|||||||
resolver0(Packet, dns:decode_message(Packet)).
|
resolver0(Packet, dns:decode_message(Packet)).
|
||||||
resolver0(Packet, QueryMsg = #dns_message{qc = 1, questions = [Question = #dns_query{name = QName, type = QType, class = QClass}|_]}) ->
|
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} ->
|
{ok, Ip} ->
|
||||||
Answer = #dns_rr {
|
Answer = #dns_rr {
|
||||||
name = QName,
|
name = QName,
|
||||||
|
|||||||
@ -16,6 +16,9 @@ start(_StartType, _StartArgs) ->
|
|||||||
%% 加速内存的回收
|
%% 加速内存的回收
|
||||||
erlang:system_flag(fullsweep_after, 16),
|
erlang:system_flag(fullsweep_after, 16),
|
||||||
|
|
||||||
|
%% 启动注册表
|
||||||
|
sdlan_hostname_regedit:init(),
|
||||||
|
|
||||||
start_http_server(),
|
start_http_server(),
|
||||||
start_tcp_server(),
|
start_tcp_server(),
|
||||||
sdlan_sup:start_link().
|
sdlan_sup:start_link().
|
||||||
|
|||||||
@ -1,24 +0,0 @@
|
|||||||
%%%-------------------------------------------------------------------
|
|
||||||
%%% @author anlicheng
|
|
||||||
%%% @copyright (C) 2025, <COMPANY>
|
|
||||||
%%% @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.
|
|
||||||
32
apps/sdlan/src/sdlan_hostname_regedit.erl
Normal file
32
apps/sdlan/src/sdlan_hostname_regedit.erl
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% @author anlicheng
|
||||||
|
%%% @copyright (C) 2025, <COMPANY>
|
||||||
|
%%% @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) ->
|
||||||
|
<<Ip0, Ip1, Ip2, Ip3>> = <<Ip:32>>,
|
||||||
|
true = ets:insert(?TABLE, {FullHostname, {Ip0, Ip1, Ip2, Ip3}}).
|
||||||
@ -231,6 +231,10 @@ handle_call({assign_ip_addr, ChannelPid, ClientId, Mac, NetAddr0, HostName}, _Fr
|
|||||||
%% 关闭之前的channel
|
%% 关闭之前的channel
|
||||||
maybe_close_channel(maps:get(Mac, UsedMap, undefined)),
|
maybe_close_channel(maps:get(Mac, UsedMap, undefined)),
|
||||||
|
|
||||||
|
%% 添加域名->ip的映射关系
|
||||||
|
FullHostname = <<HostName/binary, ".", Domain/binary>>,
|
||||||
|
sdlan_hostname_regedit:insert(FullHostname, Ip),
|
||||||
|
|
||||||
%% 建立到新的channel之间的关系
|
%% 建立到新的channel之间的关系
|
||||||
MRef = monitor(process, ChannelPid),
|
MRef = monitor(process, ChannelPid),
|
||||||
NUsedMap = maps:put(Mac, #host{client_id = ClientId, channel_pid = ChannelPid, monitor_ref = MRef}, UsedMap),
|
NUsedMap = maps:put(Mac, #host{client_id = ClientId, channel_pid = ChannelPid, monitor_ref = MRef}, UsedMap),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user