【问题标题】:How do I detect tcp-client disconnect with gen_tcp?如何检测与 gen_tcp 的 tcp-client 断开连接?
【发布时间】:2014-05-16 15:49:10
【问题描述】:

我正在尝试使用 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.

当我再次调用gen_tcp:send/2 时,第二次调用将按预期返回{error, closed}。但我想明白,为什么第一次调用成功?我错过了一些特定于 tcp 的细节吗? 这种奇怪的(对我来说)行为仅适用于 {active, false} 连接。

【问题讨论】:

    标签: tcp erlang


    【解决方案1】:

    简而言之,原因是套接字上没有活动可以确定另一端已关闭。第一个send 似乎可以工作,因为它在一个套接字上运行,从所有意图和目的来看,该套接字似乎是已连接且可操作的。但是该写入活动确定另一端已关闭,这就是第二个send 失败的原因。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2013-11-22
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多