【问题标题】:TCP server not respondingTCP 服务器没有响应
【发布时间】:2014-06-04 07:06:43
【问题描述】:

我有以下使用 gen_tcp OTP 模块的 Elixir 编写的 TCP 服务器:

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 打开侦听套接字的进程死亡时,该套接字以及通过列表套接字打开的所有套接字都死亡。

标签: tcp erlang-otp elixir gen-tcp


【解决方案1】:

我认为这是因为 server() 在 spawn() 被调用并且您的应用程序正常退出之后返回。我会这样写:

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

我还没有测试上面的代码,但这应该可以解决你的问题。

【讨论】:

  • 是的,这很可能是问题所在。另一种选择是传递--no-halt 选项:elixir --no-halt test_server.exs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2017-01-09
  • 2017-01-04
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多