TCP服务器未响应。

3

我有一个使用gen_tcp OTP模块编写的TCP服务器,使用Elixir语言编写:

defmodule Test do
  def server() do
    {:ok, listen_sock} = :gen_tcp.listen(43594, [{:active, true}, :binary])
    {:ok, accept_sock} = :gen_tcp.accept(listen_sock)
    spawn(fn() -> poll(accept_sock) end)
  end

  defp poll(sock) do
    case :gen_tcp.recv(sock, 0, 20) do
      {:ok, data} ->
          IO.puts "#{data}"
          poll(sock)
      {:error, :closed} -> :ok
    end
  end
end

Test.server

当我使用telnet连接服务器时,它会立即断开连接。有什么想法吗?

当使用:gen_tcp.listen打开监听套接字的进程死亡时,该套接字以及通过该套接字打开的所有套接字也会死亡。 - rvirding
1个回答

4
我认为是因为在调用spawn()之后,server()函数返回并且应用程序正常退出。我会将代码改成这样:
defmodule Test do
  def server() do
    {:ok, listen_sock} = :gen_tcp.listen(43594, [{:active, true}, :binary])
    {:ok, accept_sock} = :gen_tcp.accept(listen_sock)
    poll(accept_sock)
  end

  defp poll(sock) do
    case :gen_tcp.recv(sock, 0, 20) do
      {:ok, data} ->
          IO.puts "#{data}"
          poll(sock)
      {:error, :closed} -> :ok
    end
  end
end

Test.server

我没有测试过上述代码,但是那应该可以解决你的问题。

2
是的,那可能会是问题所在。另一个选项是传递 --no-halt 选项: elixir --no-halt test_server.exs - José Valim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接