zx/zomp/lib/otpr-zx/0.1.0/src/zx_net.erl

69 lines
1.9 KiB
Erlang

%%% @doc
%%% ZX Network Functions
%%%
%%% A few common network functions concentrated in one place.
%%% @end
-module(zx_net).
-author("Craig Everett <zxq9@zxq9.com>").
-copyright("Craig Everett <zxq9@zxq9.com>").
-license("GPL-3.0").
-export([send/2, disconnect/1]).
-include("zx_logger.hrl").
-spec send(Socket, Message) -> Result
when Socket :: gen_tcp:socket(),
Message :: term(),
Result :: ok
| {error, Reason},
Reason :: closed | inet:posix().
%% @doc
%% Packages an Erlang term and sends it to the indicated socket.
send(Socket, Message) ->
BinMessage = term_to_binary(Message),
gen_tcp:send(Socket, BinMessage).
-spec disconnect(Socket) -> ok
when Socket :: gen_tcp:socket().
%% @doc
%% Disconnects from a socket, handling the case where the socket is already
%% disconnected on the other side.
disconnect(Socket) ->
case zomp:peername(Socket) of
{ok, {Addr, Port}} ->
Host = inet:ntoa(Addr),
disconnect(Socket, Host, Port);
{error, Reason} ->
log(warning, "Disconnect failed with: ~p", [Reason])
end.
-spec disconnect(Socket, Host, Port) -> ok
when Socket :: gen_tcp:socket(),
Host :: string(),
Port :: inet:port_number().
disconnect(Socket, Host, Port) ->
case gen_tcp:shutdown(Socket, read_write) of
ok ->
log(info, "~ts:~w disconnected", [Host, Port]);
{error, enotconn} ->
log(info, "~ts:~w disconnected", [Host, Port]),
receive
{tcp_closed, Socket} -> ok
after 0 -> ok
end;
{error, E} ->
log(warning, "~ts:~w disconnect failed with: ~p", [Host, Port, E]),
receive
{tcp_closed, Socket} -> ok
after 0 -> ok
end
end.