%%% @doc %%% ZX Network Functions %%% %%% A few common network functions concentrated in one place. %%% @end -module(zx_net). -author("Craig Everett "). -copyright("Craig Everett "). -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.