gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:33:32 33 4
gpt4 key购买 nike

我正在尝试使用 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} 连接。

最佳答案

简而言之,原因是套接字上没有可以确定另一端已关闭的事件。第一个 send 似乎可以工作,因为它在套接字上运行,就所有意图和目的而言,该套接字似乎已连接且可操作。但是那个写事件决定了另一端是关闭的,这就是为什么第二个 send 如预期的那样失败了。

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

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

关于tcp - 如何检测 tcp 客户端与 gen_tcp 断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22860969/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com