diff --git a/lib/tcp/client.ex b/lib/tcp/client.ex index 977479f..e5121cb 100644 --- a/lib/tcp/client.ex +++ b/lib/tcp/client.ex @@ -130,6 +130,13 @@ defmodule Modbux.Tcp.Client do GenServer.call(pid, :flush) end + @doc """ + Determine if the Client is connected to a Server. + """ + def connected?(pid) do + GenServer.call(pid, :connected?) + end + # callbacks def init(args) do port = args[:tcp_port] || @port @@ -311,6 +318,11 @@ defmodule Modbux.Tcp.Client do {:reply, {:ok, state.pending_msg}, new_state} end + def handle_call(:connected?, _from, state) do + connected? = state.socket != nil && state.status == :connected + {:reply, connected?, state} + end + # only for active mode (active: true) def handle_info({:tcp, _port, response}, state) do Logger.debug("(#{__MODULE__}, :message_active) response: #{inspect(response)}") diff --git a/test/tcp/modbus_tcp_client_test.exs b/test/tcp/modbus_tcp_client_test.exs index fba0ed7..f862e8b 100644 --- a/test/tcp/modbus_tcp_client_test.exs +++ b/test/tcp/modbus_tcp_client_test.exs @@ -19,4 +19,15 @@ defmodule ModbuxTcpClientTest do assert {:error, :econnrefused} == Client.connect(cpid) assert {:error, :closed} == Client.close(cpid) end + + test "test Client connectivity status" do + {:ok, _spid} = Server.start_link(model: %{}, port: 2000) + {:ok, cpid} = Client.start_link(ip: {127, 0, 0, 1}, tcp_port: 2000) + assert false == Client.connected?(cpid) + assert :ok == Client.connect(cpid) + assert true == Client.connected?(cpid) + assert :ok == Client.close(cpid) + assert false == Client.connected?(cpid) + assert :ok == Client.stop(cpid) + end end