加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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 "...";
# ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读