我目前有一个处理来自客户端的多个连接的服务器,以及使用两个连接连接到服务器的客户端。我的客户端有两个进程分别处理与服务器之间的发送和接收,但不能同时处理两者。我目前遇到的问题是当我想关闭套接字时,我的阅读过程卡在了gen_tcp:recv/2
块上。如果我设置了超时,则在达到超时时套接字将关闭。我的问题是,是否可以进行gen_tcp:recv/3
不关闭套接字的调用。
这就是我的阅读过程。
read(Socket, Control) ->
Control ! ok,
receive
read ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
%% handling for messages;
Other ->
io:format(Other)
end,
read(self()), %% this sends "read" to itself with "!"
read(Socket, Control);
{error, Reason} ->
io:format(Reason)
end;
close ->
io:format("Closing Reading Socket.~n"),
gen_tcp:close(Socket)
end.
recv/2
正如您在此处看到的,如果没有读取任何内容,该进程将永远无法收到关闭。