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