dcdcの日記: 触発されてIRCクライアントをいじったにょ!
なんとなく、ICQがどうのという話題に触発されて、
猿はIRCクライアント環境を増やす気になっちゃったのですにょ。
別にP2Pで話したいことはほとんどないし、
身内専用IRCサーバがあるので事足りちゃうし。
emacs用のクライアントもあるし、FireWallのなかでも
CHOCOAサマは靴下入れてあれば会話は出来るし。
まぁ、そんな感じで、いまだにIRC。
ICQもだいぶ初期にIDだけはとったけど。
で、emacs用IRCクライアントとしては、irchat-pjを使っていましたが、
DCCがNAT越えで使うことができないのと、
ぱっと見の仕様上、改造するのも大変そうに見えたので、
他には無いかな、とliece-1.4.10に手を出してみた。
DCCそのものはシンプルだったので、これなら、といじってみる。
※注意※
正しいインプリメントではありません。あくまで、必要にかられての対処です。
きちんとやるなら、きちんと設計しましょう(笑)
rfcはさらっとしか読んでないので、プログラム読んで得た知見として(笑)
DCCで送る場合の挙動を書くと、
- DCCアプリ(ldcc)は、ポート、ファイル名を与えて起動され、待ち状態となる。
- PRIVMSGで送り先の人へ、ファイル名、取りに来て欲しいマシンのIPアドレス(10進コード化されたもの、なんていうんだろ)、ポート、ファイルサイズを知らせる。
- PRIVMSGを見て、送り先の人がアクセスしてくる。
こんな感じかな?
受け取る場合は、LANからWANへ出られれば、送り側のFireWall次第となります。
※問題その1
ルータ使ってて問題となるのは、まずはポート。
WAN側からのアクセスを全部自分のマシンにフォワードしてりゃ問題は無いのですが、
そんな怖いことは出来ないので、特定のポートでやり取りしたいと。
そのポートの指定そのものは、liece側に用意してあったので、liece-dcc-portを利用。
もっとも、実際はポートの初期値を指定するだけで、勝手にインクリメンタルされるという罠付。
※対処その1:インクリメンタルされないように該当コードを削る(おぃ)
liece-dcc.el内、liece-command-dcc-send の最後、liece-dcc-portを操作しているところ
あとはルータに穴あけて、ポートフォワードしておく。
※問題その2
次に、PRIVMSGで相手に通知する情報の中で、取りに来て欲しいマシンのIPアドレスを
送っているわけですが、これが実際はLANでのIPアドレスを送っちゃっている。
つまり、相手側は取りに行こうと思っても外から見えているところのIPアドレスじゃないところへアクセスしに行っちゃうわけですな。
で、これのためにliece-system-fqdnameとかあるのかと思ったら、用途が違うようで(結局何に使われるのか?までは追ってない)。
しょうがないので、まずは試しに、PRIVMSGを加工しているところをいじって、
外から見えているところのIPアドレスを送るようにする。
※対処その2
liece-dcc.el内、liece-dcc-send-filter のPRIVMSG作っているところ。hostを直接書き換え(おぃ)
とりあえず、これでやり取りできることを確認。
さて、きちんとやるには、ここから、
- NAT環境かどうかの変数を追加
- NAT環境の時、固定したFQDNがあるならそちらを使う、もしくはIRCサーバ接続時のメッセージから、自分のマシンのFQDNを自動取得
- FQDNからIPアドレスを取得、10進コード化
- 上記の対処ルーチン動作へ切換
みたいなことをすればいいと思うのですが、時間ないのとアプリ見渡すのが
しんどいのと、emacs lisp はいじる程度のことしかできないので、
手動(笑)で10進コードをある変数に与えれば動くように改造しただけにしました。
また、この他にも、ldccの仕様なのか本体の仕様なのかわかりませんが、同一ポートでは複数のldccを同時起動はできないみたいな、という問題もあります。
#転送開始されりゃできるのかもしれない?
とりあえず、気が向いたら、lieceの方に提案するかも、しないかも。
#してくれる人は大歓迎(笑)作ってくれる人は大大歓迎。
※ここでいっている10進コード化について
よくあるIPアドレスの表記は、192.168.0.1 ですが、
これを192*256^3+168*256^2+0*256+1といった計算で出したもののことです。
専門用語ではなんと言うんでしょう(ググれ?)
触発されてIRCクライアントをいじったにょ More ログイン