2013-03-17 18 views

回答

5

gen_tcp:controlling_process(Socket,Pid)用于将Socket的控制权交给进程Pid。它在Socket关闭时没有提到这个过程的行为。

有案件需要考虑:

  • 你在这种情况下,模式{活跃,假}打开服务器套接字服务器将知道该Socket被关闭时,它调用的函数调用gen_tcp: recv(Sock,Len)得到答案{error,closed}而不是预期的{ok,Binary}。如果您打算使用gen_tcp:controls_process(Socket,Pid),我建议您使用此模式,因为它可以避免代码中的竞争条件。

  • 您在模式{active,true}或{active,once}下打开服务器Socket,在这种情况下,服务器将收到一条消息{tcp_closed,Socket}。在这种情况下,有一个竞争条件看题目Erlang: Avoiding race condition with gen_tcp:controlling_process

我不认为这是服务器的作用,防止任何套接字关闭,而是随时准备接受连接。

最后总是可以终止一个进程,使用自己的协议来平滑结束,例如Pid! {停止,理由}或者使用退出(Pid,Reason)更残酷的方式。

相关问题