【问题标题】:gen_tcp:recv/2 returns error, einvalgen_tcp:recv/2 返回错误,einval
【发布时间】:2016-08-01 04:44:30
【问题描述】:

我有一个客户端,它创建 N 个进程并全部连接到这样的服务器:

 send(State = #state{low = Low, high = Low}) ->
 NewState = receive_sockets(0, Low, State),
 NewState;
 send(State = #state{low = Low}) ->
   N = Low rem 10,
   Dest = lists:nth(N + 1, State#state.dest),
   spawn(?MODULE, loop, [self(), Dest, Low]),
   NewState = State#state{low = Low + 1},
   send(NewState).

 loop(From, {IP, Port}, Low) ->
   case gen_tcp:connect(IP, Port, [binary]) of
    {ok, Socket} ->
    gen_tcp:send(Socket, integer_to_binary(Low)),
    From ! {Low, Socket},
    loop1(Socket);
    %%timer:sleep(infinity);
   _Else ->
    io:format("The connection failed ~n"),
    loop(From, {IP, Port}, Low)
   end.

 loop1(Socket) ->
  case gen_tcp:recv(Socket, 0) of
   {ok, Data} ->
    io:format("Received ~n ~p", [Data]),
    loop1(Socket);
   {error, einval} ->
    io:format("error ~n")
 end.

我正在创建许多客户端连接。稍后,服务器可能会向我发送一些数据,所以我正在使用 gen_tcp:recv/2 等待,但我收到 {error, einval}。

此外,我在使用套接字时是否有任何问题,因为我观察到套接字一旦被接受就会被关闭。

关于为什么的任何输入?

谢谢

【问题讨论】:

    标签: sockets tcp erlang erlang-otp gen-tcp


    【解决方案1】:

    默认 gen_tcp:connect 使用主动模式,除非在套接字的选项列表中指定 {active, false},在这种情况下通过调用 recv/2 检索数据包。如果您真的想使用 gen_tcp:recv 来处理数据,请使用 {active, false}。请仔细检查“gen_tcp”的手册页,尤其是活动模式相关的手册页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      相关资源
      最近更新 更多