【发布时间】:2014-05-08 05:42:33
【问题描述】:
我最近在 Mac OS X(不是我的机器!)上使用 Erlang 遇到了类似 heisenbug 的 ECONNRESET。为了简化问题的根源,也为了更好的理解错误本身,我写了下面的模块来触发ECONNRESET。不幸的是,我自己没有 Mac。在我的 Linux (ArchLinux) 上,下面的代码不会因错误匹配 {error,econnreset} 而崩溃,而是会因 {error,closed} 而崩溃。
-module(econnreset).
-export([run/0]).
run() ->
Pid = spawn_link(fun listen_and_accept/0),
Pid ! {get_port,self()},
Port = receive {port,P} -> P end,
{ok,Socket} = gen_tcp:connect("localhost", Port, [{active,false}]),
ok = gen_tcp:send(Socket, lists:duplicate(100, $a)),
%% On the following line, I expected a badmatch w/ {error,econnreset}
{ok,_} = gen_tcp:recv(Socket, 0, 1000),
ok = gen_tcp:close(Socket),
ok.
listen_and_accept() ->
{ok,LSocket} = gen_tcp:listen(0, [binary,{active,false}]),
{ok,Port} = inet:port(LSocket),
receive {get_port,Pid} -> Pid ! {port,Port} end,
{ok,Socket} = gen_tcp:accept(LSocket),
{ok,Bin} = gen_tcp:recv(Socket, 1), %=> read only 1 byte to trigger tcp RST
io:format("Server read ~p~n", [Bin]),
gen_tcp:close(Socket),
gen_tcp:close(LSocket).
我只在 Mac OS X 上遇到过 ECONNRESET 而不是在 Linux 上,这归结为两个问题:
- 上面的代码甚至能够通过调用
recv/2产生ECONNRESET吗? - Mac OS X 和 Linux 在这方面的行为是否不同?
【问题讨论】:
标签: linux macos sockets erlang