如何检测tcp客户端与gen_tcp的断开连接?

如何检测tcp客户端与gen_tcp的断开连接?,tcp,erlang,Tcp,Erlang,我正在尝试使用gen_tcp模块。 有一个服务器端代码的例子,我遇到了麻烦 %% First, I bind server port and wait for peer connection {ok, Sock} = gen_tcp:listen(7890, [{active, false}]), {ok, Peer} = gen_tcp:accept(Sock), %% Here client calls `gen_tcp:close/1` on socket and goes away.

我正在尝试使用gen_tcp模块。 有一个服务器端代码的例子,我遇到了麻烦

%% First, I bind server port and wait for peer connection
{ok, Sock} = gen_tcp:listen(7890, [{active, false}]),
{ok, Peer} = gen_tcp:accept(Sock),

%% Here client calls `gen_tcp:close/1` on socket and goes away.
%% After that I am tryin' send some message to client
SendResult = gen_server:send(Peer, <<"HELLO">>),

%% Now I guess that send is failed with {error, closed}, but...
ok = SendResult.
%%首先,我绑定服务器端口并等待对等连接
{ok,Sock}=gen_tcp:listen(7890,[{active,false}]),
{ok,Peer}=gen_tcp:accept(Sock),
%%在这里,客户端在套接字上调用'gen_tcp:close/1',然后离开。
%%之后我试着给客户发一些信息
SendResult=gen_服务器:发送(对等,),
%%现在我猜发送失败了,{error,closed},但是。。。
确定=发送结果。
当我再次调用
genu-tcp:send/2
时,第二次调用将按预期返回
{error,closed}
。但我想了解,为什么第一次呼叫成功了?我是否遗漏了一些tcp特定的细节?
这种奇怪的行为(对我来说)只适用于{active,false}连接。

简而言之,原因是套接字上没有任何活动可以确定另一端已关闭。第一个
send
似乎可以工作,因为它在一个插座上工作,无论出于何种目的,该插座似乎是连接的,并且可以工作的。但该写入活动确定另一端已关闭,这就是第二次
发送失败的原因

如果您首先从套接字读取或
recv
,您很快就会知道另一端已关闭。或者,如果套接字处于Erlang
active
模式,那么您还将了解另一端正在关闭,因为
active
模式轮询套接字

除了套接字是否处于活动模式之外,这与Erlang无关。例如,如果将C代码直接写入sockets API,您将看到相同的行为