fix handler
This commit is contained in:
parent
3cf38f3e89
commit
78c1b9a970
@ -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.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user