gen_tcp:recv/2 returns 错误,einval
gen_tcp:recv/2 returns error, einval
我有一个客户端创建了 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}。
此外,我使用套接字的方式是否有任何问题,因为我观察到套接字一经接受就会关闭。
关于为什么的任何输入?
谢谢
默认gen_tcp:connect使用主动模式,除非在套接字的选项列表中指定了{active, false},在这种情况下,通过调用recv/2检索数据包。如果您真的想使用 gen_tcp:recv 来处理数据,请使用 {active, false}。请仔细检查 "gen_tcp" 的手册页,尤其是相对于活动模式的手册页。
我有一个客户端创建了 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}。
此外,我使用套接字的方式是否有任何问题,因为我观察到套接字一经接受就会关闭。
关于为什么的任何输入?
谢谢
默认gen_tcp:connect使用主动模式,除非在套接字的选项列表中指定了{active, false},在这种情况下,通过调用recv/2检索数据包。如果您真的想使用 gen_tcp:recv 来处理数据,请使用 {active, false}。请仔细检查 "gen_tcp" 的手册页,尤其是相对于活动模式的手册页。