スキップしてメイン コンテンツに移動

投稿

11月, 2018の投稿を表示しています

timeout したくなった&IO::Socket::INET使ってみた(SQL Server の名前つきインスタンスのポート番号を得たい2)

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;

SQL Server の名前つきインスタンスのポート番号を得たい

Windows上のSQLサーバ(名前つきインスタンス)にLinuxのsqlcmdから接続したい。 オプションの -S に サーバ名,ポート番号 を指定すればいいのだけど、肝心の ポート番号が外部からわからない。 ServerBrowserServiceにアクセスするとポート番号が得られるみたいだけど、 リクエストに何を送ればいいのやら? 同じことを考えるひとはいるもので、ググって   https://qiita.com/awachang/items/c4fecbace9f02d923866 を見つけた。 ふむ。UDP1434につないで、0x4インスタンス名0x0を送ればいいのか。 Perlでソケット通信するサンプルを探して、改変して作ってみた。 実行すると、帰ってこない。。。 SQLサーバ側のパケットキャプチャだと返事をしているようだけど、 Perlプログラムは何かを待っている・・・。 もしかすると、UDPだし、コネクションクローズしてくれないから ずーっと待っているのでは? そう思ってソケットから読み取るのを10バイトにしたら、なんか動いた。 では全体を・・・試しているSQLサーバだとサーバ名とかインスタンス名 とかで全部で95バイト。読み取るバイト数を96バイトにしたら待ちのまま。。。 うーん。サーバ名とインスタンス名は変わっても問題ないようにしたいなぁ。 参考にしたページで使われているPHPだとfreadがよきに計らってくれるらしく、 ストリームがおわったら自動クローズしてくれるみたいだ。 うーん。。。。 結局、;;がたぶんデータの最後だろう、っていうことにして連続2回;がきた ら終了することにした。 いまいちだけど、目的は達成できたしこれでいいのだ。 #!/usr/bin/perl use strict; use warnings; use Socket; my $remote_host = $ARGV[0]; my $remote_port = 1434; my $instance = $ARGV[1]; my $sock; socket($sock, PF_INET, SOCK_DGRAM, getprotobyname('udp' ))   or die &quo

Windows Server 2016 にOracle11gをインストール

.Net3.5が要るらしい。 orz 一回目のインストールの際に「.Net3.5が必要」ってダイアログが山ほど出てきた。 .Net3.5が必要な場合のエラーダイアログはどうして「ダウンロードしてインストールせよ」なんだろう? 参考にした  http://otndnld.oracle.co.jp/easy/oracle11gr1/windows/pdf/SelfStudy_01_win.pdf だと、LISTNERの追加設定(?)が必要そうに書いてあるけど、やってみたら「すでに作成済み」ってなる。 それを信じて進めてみたらどうにもうまくいかない。。。 OracleDBをGUIで操作しよう、っていうのが間違いのようか気がする (逆にSQLserverをCLIでやるのは狂気の沙汰だと思う)。 一旦、アンインストールすることにして、スタートメニューにある「Universal Installer」 を実行してアンインストールしようとしたら「batファイルを実行せよ」というダイアログが。 ググりかたが悪かったのか、 「アンインストールはUniversal Installerからしかないぜ。その他の方法はどーなっても知らないぜHAHAHA」(意訳) と書いてるOracleさんしか見つからない。 どっちを信じたらとも思ったが、目の前のほうが正しいだろうという考えに従いそのバッチ を実行しました。(Universal Installerさんは何度やっても消そうともしてくれないし) バッチ実行後、しばらく放置したら終わったらしい。 Oracleさんがインストールされていたっぽいディレクトリもだいたい消えていた。 消えたよね?ってことで一度再起動してから、Oracle11gのインストールを再び実行。 エラーは出ずに無事終了。 (.Net3.5がインストール済みだったからかな??)  sqlplus / as sysdba は問題ない。でも、別PC(Linux機)からの接続はNG。  lsnrctl status コマンドの実行結果から、やはりlocalhost以外からの接続はLISTENしてない模様。 listener.oraをちょっと修正して、LISTNERサービスを再起動。  lsnrctl status を再度実行すると、IPアドレスの分も表示されたので、外部からも接続できるだろう