perl socket:如果在使用中增加端口
发布时间:2020-12-16 06:19:37 所属栏目:大数据 来源:网络整理
导读:我有以下代码: use IO::Socket::INET;use Sys::Hostname;use Socket;my($addr)=inet_ntoa((gethostbyname(hostname))[4]);my $port_to_use = 7777;my $socket = new IO::Socket::INET ( LocalHost = $addr,LocalPort = $port_to_use,Proto = 'tcp',Listen =
我有以下代码:
use IO::Socket::INET; use Sys::Hostname; use Socket; my($addr)=inet_ntoa((gethostbyname(hostname))[4]); my $port_to_use = 7777; my $socket = new IO::Socket::INET ( LocalHost => $addr,LocalPort => $port_to_use,Proto => 'tcp',Listen => 5,Reuse => 1 ); die "cannot create socket $!n" unless $socket; my $client_socket = $socket->accept(); 如果我在一个屏幕上启动它并在另一个屏幕中启动另一个屏幕,我会收到一个错误: cannot create socket Address already in use 而不是死亡,我想尝试使用不同的端口(递增1),直到它找到一个使用. 我试着用eval转换模具线但是我无法捕捉它 有什么建议? 解决方法
这是一个更整洁的替代方案,它实际上会检查以确保绑定到给定端口的失败是由于端口正在使用.它还限制要检查的端口范围.如果您使用代码
in the other answer,并且,如果由于某种原因,机器不允许您的应用程序绑定到任何端口,您将陷入无限循环.它还可能导致您的应用程序绑定到本来应该保留的端口等.
#!/usr/bin/env perl use strict; use warnings; use Carp qw( croak ); use Errno qw( EADDRINUSE ); use IO::Socket::INET; use Sys::Hostname qw( hostname ); use Socket; # These can come from a config file or command line # See also https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Dynamic.2C_private_or_ephemeral_ports # https://unix.stackexchange.com/a/39784/2371 my @port_range = (0xC000,0xFFFF); my $addr = inet_ntoa( (gethostbyname(hostname) )[4]); my $socket; TRY_PORT: for my $port ($port_range[0] .. $port_range[1]) { warn "Trying port $portn"; $socket = IO::Socket::INET->new( LocalHost => $addr,LocalPort => $port,Listen => 7,Reuse => 0,); if ($socket) { warn "Bound to port $portn"; last TRY_PORT; } if ( EADDRINUSE != $! ) { croak "Cannot bind to port '$port': $!"; } warn "Port in use,trying the next onen"; } $socket->accept or croak "..."; # ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |