fix udp_handler

This commit is contained in:
anlicheng 2026-06-28 21:30:35 +08:00
parent 7fba178acf
commit 77df81f8c3
2 changed files with 7 additions and 12 deletions

View File

@ -98,13 +98,14 @@ handle_encrypted_datagram(Packet, State = #state{idle_timeout = IdleTimeout, cip
{ok, PlainPacket} ->
handle_datagram(PlainPacket, State);
{error, Reason} ->
logger:debug("UDP relay ignored undecryptable datagram: ~p", [Reason]),
logger:error("UDP relay ignored undecryptable datagram: ~p", [Reason]),
{noreply, State, IdleTimeout}
end.
handle_datagram(Packet, State = #state{idle_timeout = IdleTimeout}) ->
case relay_server_udp_protocol:decode(Packet) of
{ok, {open, StreamId, Payload}} ->
logger:debug("UDP handler open stream: ~p", [StreamId]),
{noreply, handle_open(StreamId, Payload, State), IdleTimeout};
{ok, {data, StreamId, Payload}} ->
{noreply, handle_data(StreamId, Payload, State), IdleTimeout};
@ -118,7 +119,7 @@ handle_datagram(Packet, State = #state{idle_timeout = IdleTimeout}) ->
{noreply, State, IdleTimeout}
end.
handle_open(StreamId, Payload, State = #state{streams = Streams}) ->
handle_open(StreamId, Payload, State = #state{streams = Streams, users = Users}) ->
case maps:is_key(StreamId, Streams) of
true ->
send_error(StreamId, <<"stream already open">>, State),
@ -126,7 +127,7 @@ handle_open(StreamId, Payload, State = #state{streams = Streams}) ->
false ->
case relay_server_udp_protocol:decode_open_request(Payload) of
{ok, Request} ->
case authenticate(Request, State#state.users) of
case authenticate(Request, Users) of
ok ->
open_stream(StreamId, Request, State);
error ->
@ -141,7 +142,7 @@ handle_open(StreamId, Payload, State = #state{streams = Streams}) ->
end
end.
open_stream(StreamId, #{host := Host, port := Port}, State) ->
open_stream(StreamId, #{host := Host, port := Port}, State = #state{streams = Streams, sockets = Sockets}) ->
case connect_remote(Host, Port, State#state.connect_timeout) of
{ok, Socket} ->
Stream = #stream{
@ -151,7 +152,7 @@ open_stream(StreamId, #{host := Host, port := Port}, State) ->
port = Port
},
logger:debug("UDP relay stream ~p opened to ~ts:~p", [StreamId, Host, Port]),
put_stream(Stream, State);
State#state{streams = maps:put(StreamId, Stream, Streams), sockets = maps:put(Socket, StreamId, Sockets)};
{error, Reason} ->
Message = iolist_to_binary(io_lib:format("connect failed: ~p", [Reason])),
send_error(StreamId, Message, State),
@ -223,12 +224,6 @@ send_remote(#stream{socket = Socket}, Payload) ->
set_active_once(#stream{socket = Socket}) ->
inet:setopts(Socket, [{active, once}]).
put_stream(Stream = #stream{id = StreamId, socket = Socket}, State) ->
State#state{
streams = maps:put(StreamId, Stream, State#state.streams),
sockets = maps:put(Socket, StreamId, State#state.sockets)
}.
close_stream(StreamId, State = #state{streams = Streams}) ->
case maps:get(StreamId, Streams, undefined) of
undefined ->

View File

@ -3,7 +3,7 @@
{udp_server, [
{enabled, true},
{listener, 'relay_server/udp'},
{listen_on, 16380},
{listen_on, 1443},
{idle_timeout, 30000},
{connect_timeout, 5000},
{max_connections, 1024},