From 80a471a039c0d7cec27c8b9da016dc0e09be9d62 Mon Sep 17 00:00:00 2001 From: Dom Bernero Date: Thu, 16 Oct 2025 15:11:08 -0400 Subject: [PATCH 1/2] Add function to expose TCP connection status --- lib/tcp/client.ex | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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)}") From 5e2abe5fd2ba91c781799c0ceb92cde99ee1a226 Mon Sep 17 00:00:00 2001 From: Dom Bernero Date: Thu, 16 Oct 2025 15:11:24 -0400 Subject: [PATCH 2/2] Add Tcp.Client.connected?/1 unit test --- test/tcp/modbus_tcp_client_test.exs | 11 +++++++++++ 1 file changed, 11 insertions(+) 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