我正在尝试使用 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,您会看到相同的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)