From a11659869830cda135acd5a425db0ba3219dc185 Mon Sep 17 00:00:00 2001 From: ChenYunDa Date: Sun, 15 Feb 2026 13:55:39 +0800 Subject: [PATCH] fixup --- lib/alter_proxy.ex | 18 +++++++------- lib/alter_proxy/application.ex | 1 + lib/broker.ex | 26 ++++++++++++++++++++ lib/manager.ex | 17 ++++++++++++++ lib/tcp_handler.ex | 43 ++++++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 lib/broker.ex create mode 100644 lib/manager.ex create mode 100644 lib/tcp_handler.ex diff --git a/lib/alter_proxy.ex b/lib/alter_proxy.ex index e86cb91..b5ff824 100644 --- a/lib/alter_proxy.ex +++ b/lib/alter_proxy.ex @@ -10,17 +10,19 @@ defmodule AlterProxy do backlog: 100 ]) - accept_loop(listen_socket) + spawn(__MODULE__, :accept_loop, [listen_socket]) + listen_socket end - defp accept_loop(listen_socket) do - {:ok, socket} = :gen_tcp.accept(listen_socket) + def accept_loop(listen_socket) do + case :gen_tcp.accept(listen_socket) do + {:ok, socket} -> + spawn(__MODULE__, :handle_client, [socket]) + accept_loop(listen_socket) - # 爲每個客戶端創建新進程處理 - spawn(__MODULE__, :handle_client, [socket]) - - # 繼續等待下一個連接 - accept_loop(listen_socket) + {:error, reason} -> + IO.puts("接受連接失敗: #{reason}") + end end def handle_client(socket) do diff --git a/lib/alter_proxy/application.ex b/lib/alter_proxy/application.ex index 0c534b4..fa39af8 100644 --- a/lib/alter_proxy/application.ex +++ b/lib/alter_proxy/application.ex @@ -10,6 +10,7 @@ defmodule AlterProxy.Application do children = [ # Starts a worker by calling: AlterProxy.Worker.start_link(arg) # {AlterProxy.Worker, arg} + {Manager, name: Manager} ] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/lib/broker.ex b/lib/broker.ex new file mode 100644 index 0000000..d35e861 --- /dev/null +++ b/lib/broker.ex @@ -0,0 +1,26 @@ +defmodule Broker do + use GenServer + + def init(opts) do + {:ok, listen_socket} = + :gen_tcp.listen(opts[:port], [ + :binary, + reuseaddr: true, + active: false, + backlog: 100 + ]) + + {:ok, opts} + end + + defp accept_loop(listen_socket) do + case :gen_tcp.accept(listen_socket) do + {:ok, socket} -> + spawn(__MODULE__, :handle_client, [socket]) + accept_loop(listen_socket) + + {:error, reason} -> + IO.puts("接受連接失敗: #{reason}") + end + end +end diff --git a/lib/manager.ex b/lib/manager.ex new file mode 100644 index 0000000..2b04470 --- /dev/null +++ b/lib/manager.ex @@ -0,0 +1,17 @@ +defmodule Manager do + use DynamicSupervisor + + def start_link(init_arg) do + DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__) + end + + @impl true + def init(_init_arg) do + DynamicSupervisor.init(strategy: :one_for_one) + end + + def create_broker(port) do + spec = {Broker, port} + DynamicSupervisor.start_child(__MODULE__, spec) + end +end diff --git a/lib/tcp_handler.ex b/lib/tcp_handler.ex new file mode 100644 index 0000000..d783a7c --- /dev/null +++ b/lib/tcp_handler.ex @@ -0,0 +1,43 @@ +defmodule TcpHandler do + def start(port) do + # 監聽端口 + {:ok, listen_socket} = + :gen_tcp.listen(port, [ + :binary, + packet: :line, + reuseaddr: true, + active: false, + backlog: 100 + ]) + + accept_loop(listen_socket) + end + + defp accept_loop(listen_socket) do + case :gen_tcp.accept(listen_socket) do + {:ok, socket} -> + spawn(__MODULE__, :handle_client, [socket]) + accept_loop(listen_socket) + + {:error, reason} -> + IO.puts("接受連接失敗: #{reason}") + end + end + + def handle_client(socket) do + # 接收數據 + case :gen_tcp.recv(socket, 0) do + {:ok, data} -> + IO.puts("收到: #{data}") + :gen_tcp.send(socket, "Echo: #{data}") + # 繼續接收 + handle_client(socket) + + {:error, :closed} -> + IO.puts("客戶端斷開連接") + + {:error, reason} -> + IO.puts("接收數據失敗: #{reason}") + end + end +end