SQLserver Browserは間違ったインスタンス名が届いた場合、返事をまったくせず 全力スルーしてくれる。 なので、タイムアウトしないとバッチ処理にしたらトラブルの元か・・。 alarmっていうのがあるみたいだから、それを使ってみよう。 #!/usr/bin/perl use IO::Socket; my $remote_host = $ARGV[0]; my $remote_port = 1434; my $instance = $ARGV[1]; my $sock = IO::Socket::INET->new( PeerAddr => $remote_host, PeerPort => $remote_port, Proto => "udp", Timeout => 5 ) or die $!; $sock->print(pack("c",0x4) . $instance . pack("c",0x0)); my $allstring = ""; eval { local $SIG{ALRM} = sub { die; }; alarm 5; while ( $allstring !~ /\;\;/ ){ $allstring .= $sock->getc; } alarm 0; }; alarm 0; # print "$allstring\n"; my ( @newport ) = $allstring =~ /\;tcp\;(\d+)\;/; print "$newport[0]\n"; $sock->close;