Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang:如何在Linux上触发EconReset?_Linux_Macos_Sockets_Erlang - Fatal编程技术网

Erlang:如何在Linux上触发EconReset?

Erlang:如何在Linux上触发EconReset?,linux,macos,sockets,erlang,Linux,Macos,Sockets,Erlang,我最近在MacOSX(不是我的机器!)上的Erlang上遇到了类似heisenbug的EconReset。为了简化问题的根源,为了更好地理解错误本身,我编写了以下模块来触发ECONNRESET。不幸的是,我自己没有Mac电脑。在我的Linux(ArchLinux)上,下面的代码不会因为错误匹配{error,econnreset}而崩溃,而是因为错误匹配{error,closed} -模块(EconReset)。 -导出([run/0])。 运行()-> Pid=spawn_链接(有趣的侦听和接受

我最近在MacOSX(不是我的机器!)上的Erlang上遇到了类似heisenbug的
EconReset
。为了简化问题的根源,为了更好地理解错误本身,我编写了以下模块来触发
ECONNRESET
。不幸的是,我自己没有Mac电脑。在我的Linux(ArchLinux)上,下面的代码不会因为错误匹配
{error,econnreset}
而崩溃,而是因为错误匹配
{error,closed}

-模块(EconReset)。
-导出([run/0])。
运行()->
Pid=spawn_链接(有趣的侦听和接受/0),
Pid!{get_port,self()},
端口=接收{Port,P}->P结束,
{ok,Socket}=gen_tcp:connect(“localhost”,端口,[{active,false}]),
ok=gen_tcp:send(套接字,列表:重复(100美元)),
%%在下一行中,我预期会出现一个错误匹配w/{error,econnreset}
{ok,{}=gen_tcp:recv(套接字,0,1000),
ok=发电机tcp:关闭(插座),
好啊
倾听并接受()->
{ok,LSocket}=gen_tcp:listen(0,[二进制,{active,false}]),
{ok,Port}=inet:Port(LSocket),
接收{get_port,Pid}->Pid!{端口,端口}结束,
{ok,Socket}=gen_tcp:accept(LSocket),
{ok,Bin}=gen_tcp:recv(Socket,1),%%=>只读1字节以触发tcp RST
io:格式(“服务器读取~p~n,[Bin]),
gen_tcp:关闭(插座),
gen_tcp:关闭(LSocket)。
由于我只在Mac OS X上遇到了
ECONNRESET
,而在Linux上没有遇到,这归结为两个问题:

  • 上面的代码是否能够通过调用
    recv/2
    来生成
    ECONNRESET
  • Mac OS X和Linux在这里的表现是否不同

  • 可能发生这种情况的一些场景

    尝试在远程端点已开始关闭其连接端的套接字上发送新数据可能会导致EconReset。(有时会导致SIGPIPE升高)

    通常,这很难重现,因为大多数套接字代码都会通过检测返回0的recv()调用来通知关闭的连接

    如果远程主机崩溃或断电,也可能发生这种情况。典型的情况是两台主机之间存在活动的TCP连接。两台主机都没有使用TCP keep alives,只在彼此之间定期发送/接收数据。目前,假设两台主机都处于空闲状态,并且彼此之间没有任何数据要发送

    第一台主机主机A暂时断电(即拔下电源线)并重新启动。另一台主机(主机B)没有意识到停机。因此,TCP状态机认为套接字仍处于连接状态。在某个时刻,主机B尝试在套接字上发送数据。IP数据包最终到达主机A。但主机A的TCP状态机自重新启动后没有主机B的IP:端口的连接记录。因此,它唯一能做的就是发回RST,通知主机B连接已断开

    我听说了,但我可能错了。。。通过使用带零值的SO_LINGER,可以强制套接字进入关闭状态,而无需发送FIN。因此,另一方发送的后续数据将导致RST作为响应