如何通过Elixir监听多个端口?

时间:2018-08-06 12:35:03

标签: networking network-programming erlang elixir gen-tcp

我想通过Elixir监听2个端口。我设法监听了端口。但是,我无法从第二个端口获取数据。

  def accept() do
    {:ok, socket} = :gen_tcp.listen(7777, [:binary, packet: 0, active: false, reuseaddr: true])

    {:ok, httpSocket} =
      :gen_tcp.listen(8787, [:binary, packet: 0, active: false, reuseaddr: true])

    http_loop_acceptor(httpSocket)
    loop_acceptor(socket)
  end

  defp http_loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    pid = spawn(fn -> http_serve(client) end)
    :ok = :gen_tcp.controlling_process(client, pid)
    http_loop_acceptor(socket)
  end

  defp loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    pid = spawn(fn -> serve(client) end)
    :ok = :gen_tcp.controlling_process(client, pid)
    loop_acceptor(socket)
  end

我可以将数据发送到 8787 端口(httpSocket)。但是,我无法将任何数据发送到 7777 (套接字)。

如果更改这两行的顺序,则可以将数据发送到 7777 (套接字),而不能将任何数据发送到 8787 端口。

>
http_loop_acceptor(httpSocket)
loop_acceptor(socket)

如何监听多个端口并通过这些端口接收数据?

1 个答案:

答案 0 :(得分:3)

在您的accept函数中,对http_loop_acceptor的调用将无限递归,这意味着永远不会调用loop_acceptor

如果要在两个套接字上侦听,则需要启动两个单独的进程,每个套接字一个。一种快速而肮脏的方法是使用spawn,但是在实际的应用程序中,您会将这些过程建模为监督树的一部分。