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).
-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) ->
{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)]),
loop(Transport, Peer, IdleTimeout).
{ok, #state{
server = Server,
peer = Peer,
idle_timeout = IdleTimeout
}, IdleTimeout}.
loop(Transport = {udp, Server, _Sock}, Peer, IdleTimeout) ->
receive
{datagram, Server, <<"stop">>} ->
logger:debug("UDP peer stopped: ~s", [esockd:format(Peer)]),
exit(normal);
{datagram, Server, Packet} ->
Reply = handle_packet(Peer, Packet),
Server ! {datagram, Peer, Reply},
loop(Transport, Peer, IdleTimeout)
after IdleTimeout ->
logger:debug("UDP peer idle timeout: ~s", [esockd:format(Peer)]),
exit(normal)
end.
handle_call(_Request, _From, State = #state{idle_timeout = IdleTimeout}) ->
{reply, {error, bad_request}, State, IdleTimeout}.
handle_cast(_Request, State = #state{idle_timeout = IdleTimeout}) ->
{noreply, State, IdleTimeout}.
handle_info({datagram, Server, <<"stop">>}, State = #state{server = Server, peer = Peer}) ->
logger:debug("UDP peer stopped: ~s", [esockd:format(Peer)]),
{stop, normal, State};
handle_info({datagram, Server, Packet}, State = #state{server = Server, peer = Peer, idle_timeout = IdleTimeout}) ->
Reply = handle_packet(Peer, Packet),
Server ! {datagram, Peer, Reply},
{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) ->
Packet.