From 78c1b9a970739ebe9a6ff2462b9bdc505dff28e6 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Sat, 27 Jun 2026 14:55:20 +0800 Subject: [PATCH] fix handler --- .../src/relay_server_udp_handler.erl | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/apps/relay_server/src/relay_server_udp_handler.erl b/apps/relay_server/src/relay_server_udp_handler.erl index bb32513..ef921c3 100644 --- a/apps/relay_server/src/relay_server_udp_handler.erl +++ b/apps/relay_server/src/relay_server_udp_handler.erl @@ -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.