gpt4 book ai didi

sockets - 在其他进程中失败的任务接受了套接字

转载 作者:行者123 更新时间:2023-12-03 11:52:57 25 4
gpt4 key购买 nike

我正在尝试测试一些 Elixir 代码,并遇到了我不了解的gen_tcp的某些行为。当我gen_tcp.accept一个套接字时,我可以在创建它的任务中“访问”它,但是不能使用其他套接字。我认为这是一个“controlling_process”问题,但是即使我添加了任何使用: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}

Elixir 版
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将返回Task进程的PID。由于您需要此处的父进程的值,因此需要将该值保存在传递给Task.async的fn之外,然后在内部使用它。

变更:

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

到:
me = self()
server_task = Task.async(fn -> ElixirQuestion.serve_one_client(socket, me) 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]}

关于sockets - 在其他进程中失败的任务接受了套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47190594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com