fix handler

This commit is contained in:
anlicheng 2026-06-27 14:55:20 +08:00
parent 3cf38f3e89
commit 78c1b9a970

View File

@ -5,28 +5,53 @@
-module(relay_server_udp_handler). -module(relay_server_udp_handler).
-export([start_link/3, init/3, loop/3, handle_packet/2]). -behaviour(gen_server).
-export([start_link/3, handle_packet/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-record(state, {
server :: pid(),
peer :: {inet:ip_address(), inet:port_number()},
idle_timeout :: timeout()
}).
start_link(Transport, Peer, IdleTimeout) -> start_link(Transport, Peer, IdleTimeout) ->
{ok, spawn_link(?MODULE, init, [Transport, Peer, IdleTimeout])}. gen_server:start_link(?MODULE, [Transport, Peer, IdleTimeout], []).
init(Transport, Peer, IdleTimeout) -> init([{udp, Server, _Sock}, Peer, IdleTimeout]) ->
logger:debug("UDP peer connected: ~s", [esockd:format(Peer)]), logger:debug("UDP peer connected: ~s", [esockd:format(Peer)]),
loop(Transport, Peer, IdleTimeout). {ok, #state{
server = Server,
peer = Peer,
idle_timeout = IdleTimeout
}, IdleTimeout}.
loop(Transport = {udp, Server, _Sock}, Peer, IdleTimeout) -> handle_call(_Request, _From, State = #state{idle_timeout = IdleTimeout}) ->
receive {reply, {error, bad_request}, State, IdleTimeout}.
{datagram, Server, <<"stop">>} ->
logger:debug("UDP peer stopped: ~s", [esockd:format(Peer)]), handle_cast(_Request, State = #state{idle_timeout = IdleTimeout}) ->
exit(normal); {noreply, State, IdleTimeout}.
{datagram, Server, Packet} ->
Reply = handle_packet(Peer, Packet), handle_info({datagram, Server, <<"stop">>}, State = #state{server = Server, peer = Peer}) ->
Server ! {datagram, Peer, Reply}, logger:debug("UDP peer stopped: ~s", [esockd:format(Peer)]),
loop(Transport, Peer, IdleTimeout) {stop, normal, State};
after IdleTimeout -> handle_info({datagram, Server, Packet}, State = #state{server = Server, peer = Peer, idle_timeout = IdleTimeout}) ->
logger:debug("UDP peer idle timeout: ~s", [esockd:format(Peer)]), Reply = handle_packet(Peer, Packet),
exit(normal) Server ! {datagram, Peer, Reply},
end. {noreply, State, IdleTimeout};
handle_info(timeout, State = #state{peer = Peer}) ->
logger:debug("UDP peer idle timeout: ~s", [esockd:format(Peer)]),
{stop, normal, State};
handle_info(_Info, State = #state{idle_timeout = IdleTimeout}) ->
{noreply, State, IdleTimeout}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
handle_packet(_Peer, Packet) -> handle_packet(_Peer, Packet) ->
Packet. Packet.