いくつかのエリクサー コードをテストしようとしていますが、理解できない 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}
エリクサー版
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