Erlang OTP主管gen_tcp - {error,eaddrinuse}

时间:2014-05-21 14:31:36

标签: erlang restart otp supervisor gen-tcp

我没有看到如何向崩溃的gen_tcp添加管理程序:listen-thread实际上会重启该worker。因为崩溃会使我想听的端口在短时间内无用。当发生崩溃并且我试图手动重启我的应用程序时,我会收到" {error,eaddrinuse}"。我还没有为这名工人实施任何主管,因为我没有看到它如何运作。

如何重新启动gen_tcp:listen?

2 个答案:

答案 0 :(得分:2)

在大多数情况下,由于侦听套接字链接到控制进程(创建它的进程),此进程的终止将很好地关闭套接字并允许您再次在同一端口上侦听。

对于所有其他情况,您应将{reuseaddr, true}选项传递给gen_tcp:listen/2。实际上,应用程序的监听套接字在崩溃后的短暂时间内保持活动状态,此选项允许您在此期间重用该地址。

答案 1 :(得分:0)

管理gen_tcp套接字的进程是gen_server吗?如果是这样,它会让你的生活更轻松。

如果是gen_server,请将process_flag(trap_exit, true)添加到init函数中。这使得当您的进程“崩溃”时,它会在实际退出进程之前调用terminate/2回调函数。使用此方法,您可以在terminate函数中手动关闭侦听套接字,从而避免恼人的端口清除延迟。

如果您没有使用gen_server,同样的原则仍然适用,但您必须更加明确地了解错误。