Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/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
Sockets 从任务接受的套接字在其他进程中失败_Sockets_Elixir_Gen Tcp - Fatal编程技术网

Sockets 从任务接受的套接字在其他进程中失败

Sockets 从任务接受的套接字在其他进程中失败,sockets,elixir,gen-tcp,Sockets,Elixir,Gen Tcp,我正在测试一些长生不老药代码,遇到了gen_tcp的一些行为,我不明白。当我gen_tcp.accept套接字时,我可以在创建它的任务中“访问”它,但不能是另一个。我认为这是一个“控制_进程”问题,但即使我添加了任何尝试使用:inet.getstat都会导致无效参数错误。我也不能在插座上接收,Elixir声称它已关闭,但对于这个问题,getstat更容易。见下文: defmodule ElixirQuestion do def serve_one_client(socket, pid)

我正在测试一些长生不老药代码,遇到了gen_tcp的一些行为,我不明白。当我gen_tcp.accept套接字时,我可以在创建它的任务中“访问”它,但不能是另一个。我认为这是一个“控制_进程”问题,但即使我添加了任何尝试使用:inet.getstat都会导致无效参数错误。我也不能在插座上接收,Elixir声称它已关闭,但对于这个问题,getstat更容易。见下文:

defmodule ElixirQuestion do
  def serve_one_client(socket, pid) 
  do  
    {:ok, server_socket} = :gen_tcp.accept(socket)
    :ok = :gen_tcp.controlling_process(server_socket, pid)
    IO.inspect(:inet.getstat(server_socket))
    server_socket 
  end 
end

{:ok, socket} = :gen_tcp.listen(0, [:binary, 
                                      {:packet, :raw}, 
                                      {:active, false}])
{:ok, port_number} = :inet.port(socket)
server_task = Task.async(fn -> ElixirQuestion.serve_one_client(socket, self()) end)
{:ok, _client_socket} = :gen_tcp.connect('localhost', port_number, [active: false]) 
server_socket = Task.await(server_task)

IO.inspect(:inet.getstat(server_socket))
预期产量

{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}
{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}
接收输出

{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}
{:error, :einval}
长生不老药

Erlang/OTP 19 [erts-8.3.5.3] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.4.5
self()。由于您需要父进程的值,因此需要将该值保存在传递给
Task.async
的fn之外,然后在内部使用该值

更改:

server_task = Task.async(fn -> ElixirQuestion.serve_one_client(socket, self()) end)
致:

提供您期望的输出:

{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}
{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}

谢谢我知道当我得到答案时,我会很生气的!非常感谢!
{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}
{:ok,
 [recv_oct: 0, recv_cnt: 0, recv_max: 0, recv_avg: 0, recv_dvi: 0, send_oct: 0,
  send_cnt: 0, send_max: 0, send_avg: 0, send_pend: 0]}