在16358 gen_tcp:connect调用之后,Erlang gen_server eaddr无效

sqxo8psd  于 2023-11-15  发布在  Erlang
关注(0)|答案(1)|浏览(291)

我正在用Erlang写一个服务器,想打开大量的连接。问题是我在16358次gen_tcp:connect/3调用后收到**{error,eaddrnotavail}**。正如你在下面看到的,服务器相当简单。
我修改了MacOS约塞米蒂限制; ulimit -n输出为6553600。
我从以下内容开始:

  1. erl +Q 134217727 +P 1000000 -env ERL_MAX_PORTS 40960000 -env ERTS_MAX_PORTS 40960000

字符串
服务器:

  1. -module(naive_server).
  2. -author("Stefan Stan").
  3. -compile(export_all).
  4. start_server(Port) ->
  5. Pid = spawn_link(fun() ->
  6. {ok, Listen} = gen_tcp:listen(Port, [binary, {backlog, 6553600}]),
  7. spawn(fun() -> acceptor(Listen, 0) end),
  8. timer:sleep(infinity)
  9. end),
  10. {ok, Pid}.
  11. acceptor(ListenSocket, Nr) ->
  12. {ok, Socket} = gen_tcp:accept(ListenSocket),
  13. io:format("Client nr ~p connected~n", [Nr]),
  14. spawn(fun() -> acceptor(ListenSocket,Nr+1) end),
  15. handle(Socket).
  16. handle(Socket) ->
  17. receive
  18. {tcp, Socket, <<"quit", _/binary>>} ->
  19. gen_tcp:close(Socket);
  20. {tcp, Socket, Msg} ->
  21. gen_tcp:send(Socket, Msg),
  22. handle(Socket)
  23. end.


客户:

  1. -module(naive_client).
  2. -author("Stefan Stan").
  3. %% API
  4. -export([connect_clients/3, connect/1]).
  5. connect(Port) ->
  6. gen_tcp:connect({127,0,0,1}, Port, []).
  7. connect_clients(Number, Port, List) when is_number(Number), Number >= 0, is_number(Port), Port>0 ->
  8. F =
  9. fun() ->
  10. case Number of
  11. 0 -> {ok, lists:reverse(List)};
  12. _ ->
  13. {ok, Pid} = connect(Port),
  14. NewList = [Pid|List],
  15. connect_clients(Number-1, Port, NewList)
  16. end
  17. end,
  18. spawn(F).

fdx2calv

fdx2calv1#

我想,你可能已经用完了短暂的输出端口(由你的客户端使用)。你可以运行:
macosx$ sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last的。
在我的机器上,它会给我:

  1. net.inet.ip.portrange.first: 49152
  2. net.inet.ip.portrange.last: 65535

字符串
差额是16383,和你的号码很接近。

相关问题