69 lines
1.9 KiB
Erlang
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.
|