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