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;
コメント
コメントを投稿