Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP服务器没有响应_Tcp_Otp_Elixir_Gen Tcp - Fatal编程技术网

TCP服务器没有响应

TCP服务器没有响应,tcp,otp,elixir,gen-tcp,Tcp,Otp,Elixir,Gen Tcp,我使用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) en

我使用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连接到服务器,它就会断开连接。知道发生了什么吗?

我认为这是因为调用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

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

是的,这可能就是问题所在。另一个选项是通过
--no-halt
选项:
elixir--no-halt test\u server.exs
当使用
:gen\u tcp.listen打开侦听套接字的进程终止时,该套接字以及通过列表套接字打开的所有套接字终止。