documents:proglang:perl:perl-004
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:perl:perl-004 [2026/05/08 11:54] – ↷ documents:perl:perl-004 から documents:proglang:perl:perl-004 へページを移動しました。 k896951 | documents:proglang:perl:perl-004 [2026/05/17 15:06] (現在) – [IPメッセンジャーへメッセージを送る Perl版] k896951 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | |||
| + | ====== 102.IPメッセンジャーへメッセージを送る Perl版 ====== | ||
| + | |||
| + | |||
| + | 2008年01月31日 03時02分02秒\\ | ||
| + | 新規 | ||
| + | |||
| + | 2013年6月13日\\ | ||
| + | NKF.pmを使わないソースを追加。意外と需要があったのね。 | ||
| + | |||
| + | |||
| + | ===== これは何? ===== | ||
| + | |||
| + | perlで書いたIPメッセンジャークライアント簡易版の説明。 | ||
| + | |||
| + | たまたま、rubyスクリプトで記述されたIPメッセンジャークライアントをWeb上で見付けました。 | ||
| + | ジョブの結果をメッセージで知らせる為のものだったようです。 | ||
| + | |||
| + | 非常に短くすっきりと書かれていて、「こんな簡単にかけるんだ」と認識。早速Perl対応版を書いてみました。 | ||
| + | |||
| + | ※覚書に付き正確性は保証できない | ||
| + | |||
| + | |||
| + | ===== 本物とは違うところ ===== | ||
| + | |||
| + | このスクリプトで送ったメッセージへの返信はできないかもしれません。 | ||
| + | なぜなら、送った先のクライアントのリストに現れていないユーザから受信すると「送信者不明」のメッセージになってしまうのです。 | ||
| + | つまり、匿名で送ってしまう感じになります。 | ||
| + | ※IPメッセンジャーの種類によっては送り主のIPアドレスを表示できるものもあるかもしれません。 | ||
| + | |||
| + | |||
| + | ===== 使い方 ===== | ||
| + | |||
| + | 以下のコマンドラインでメッセージを送ります。 | ||
| + | |||
| + | perl ipmsg.pl 送り先IPアドレス | ||
| + | |||
| + | または | ||
| + | cat << EOF | perl ipmsg.pl 送り先IPアドレス | ||
| + | メッセージ文字列 | ||
| + | EOF | ||
| + | |||
| + | でスクリプトにメッセージを食わせます。 | ||
| + | |||
| + | ===== ソース ===== | ||
| + | |||
| + | Perl5.8以降で使える(と思う)Encode.pmを使ったソース。ipmsg.pl と名称をつけてください。 | ||
| + | <code perl ipmsg.pl> | ||
| + | # | ||
| + | # | ||
| + | # ipmsg.pl <host to send> <your name> < | ||
| + | # | ||
| + | # ipmsg.pl <host to send> <your name> | ||
| + | # | ||
| + | |||
| + | use Socket; | ||
| + | use Sys:: | ||
| + | use Encode; | ||
| + | |||
| + | ## self info | ||
| + | my $selfencode = " | ||
| + | my $outencode | ||
| + | |||
| + | ## to info | ||
| + | my $tohost | ||
| + | my $toport | ||
| + | |||
| + | ## from info | ||
| + | my $myname | ||
| + | my $myhost | ||
| + | |||
| + | ## net info | ||
| + | my $proto | ||
| + | my $ihost | ||
| + | my $ipaddr | ||
| + | my $hispaddr = sockaddr_in( $toport, $tohost ); | ||
| + | |||
| + | my $sendtext; | ||
| + | |||
| + | if (@ARGV == 3) { | ||
| + | my $c = $ARGV[2]; | ||
| + | $sendtext = sprintf( ' | ||
| + | } | ||
| + | else { | ||
| + | my $c = < | ||
| + | $sendtext = encode($outencode, | ||
| + | $sendtext = sprintf( ' | ||
| + | } | ||
| + | |||
| + | socket( SOCKET, PF_INET, SOCK_DGRAM, $proto); | ||
| + | bind( SOCKET, $ipaddr); | ||
| + | send( SOCKET, $sendtext, 0, $hispaddr); | ||
| + | |||
| + | </ | ||
| + | |||
| + | コード中の | ||
| + | <code perl> | ||
| + | my $selfencode = " | ||
| + | </ | ||
| + | はスクリプトを実行するシステムによります。私はeuc-jpな環境で実行したのでこうなっています。utf-8な環境の人はここの書き直しが必要でしょう。 | ||
| + | |||
| + | |||
| + | NKF.pmをつかう古いソース。ipmsg.pl と名称をつけてください。 | ||
| + | <code perl ipmsg.pl> | ||
| + | # | ||
| + | # | ||
| + | # ipmsg.pl <host to send> <your name> < | ||
| + | # | ||
| + | # ipmsg.pl <host to send> <your name> | ||
| + | # | ||
| + | |||
| + | use Socket; | ||
| + | use Sys:: | ||
| + | use NKF; | ||
| + | |||
| + | ## to info | ||
| + | my $tohost | ||
| + | my $toport | ||
| + | |||
| + | ## from info | ||
| + | my $myname | ||
| + | my $myhost | ||
| + | |||
| + | ## net info | ||
| + | my $proto | ||
| + | my $ihost | ||
| + | my $ipaddr | ||
| + | my $hispaddr = sockaddr_in( $toport, $tohost ); | ||
| + | |||
| + | my $opt = " | ||
| + | my $sendtext; | ||
| + | |||
| + | if (@ARGV == 3) { | ||
| + | my $c = $ARGV[2]; | ||
| + | | ||
| + | } | ||
| + | else { | ||
| + | my $c = < | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | | ||
| + | bind( SOCKET, $ipaddr); | ||
| + | send( SOCKET, $sendtext, 0, $hispaddr); | ||
| + | </ | ||
| + | |||
| + | NKF.pm および Socket.pm が必要になります。 | ||
| + | ※Perl 5.8とかであれば NKF.pm無しにかけるようになるみたいですね。 | ||
| + | |||
| + | {{tag> Perl 技術資料}} | ||
documents/proglang/perl/perl-004.txt · 最終更新: by k896951
