如何避免脚本崩溃后在Perl中监听套接字?

时间:2019-02-13 00:52:58

标签: perl tcp

我有一个使用IO :: Socket :: INET建立TCP服务器的脚本

my $socket = new IO::Socket::INET (
LocalHost => '0.0.0.0',
LocalPort => '10010',
Proto => 'tcp',
Listen => 5,
);

如果我的脚本崩溃或在服务器套接字关闭之前被用户停止,那么下次运行脚本时,它就无法绑定到该端口,因为仍有进程在监听该端口

除了结果netstat -anobp tcp

TCP    0.0.0.0:10010          0.0.0.0:0              LISTENING       22628
[System]

是的,我正在使用Windows。

任务终止请求:

taskkill /f /PID 22628

失败:

ERROR: The process "22628" not found.

解决此问题的唯一方法是重新启动或增加侦听端口。由于我不是一个真正的软件开发人员,并且可以在不崩溃的情况下第一次编写出色的代码,因此我经常遇到这个问题。

还值得注意的是,只有在客户端连接到服务器后,这种情况才会发生。

是否有办法阻止这种情况的发生(没有孤儿听取过程)或摆脱孤儿的方法?

1 个答案:

答案 0 :(得分:2)

添加以下内容后问题消失了吗?

在大多数系统上,解决方案是:

my $socket = new IO::Socket::INET (
    ...
    ReuseAddr => 1,
    ReusePort => 1,
    ...
);

在没有SO_REUSEPORT的系统(例如Windows)上,解决方案是:

my $socket = new IO::Socket::INET (
    ...
    ReuseAddr => 1,
    ...
);