発覚
今までずっと改行コードが二重に送信されていた。Enter キーを押すとプロンプトが二つ返される・・・そのこと自体に疑問は感じていたものの、これといって実害がなかったため、そのまま放置していた。最近 vi をインストールしたことで明らかに改行の動作がおかしいことに気付いた。プロンプトと同様に改行も二つ挿入されてしまう。さすがにこれでは使いづらいということで PuTTY の設定を見直すことにした。
難航
ところが肝心の設定項目が中々見つからない。原因は他にあるのかと
Windows 付属の telnet.exe で試してみたが、同じようにプロンプトが二つ返ってくる。しかしこちらは Enter キーで送信するコードを CR+LF から CR に変更することで解決した(unset crlf)。やはり改行コードの設定が問題らしい。
解決
しぶとく設定画面とにらめっこをしていたら、Connection -> Telnet に "Return key sends Telnet New Line instead of ^M" という項目があった。^M とは制御文字の 0x0D つまり CR を表す。チェックは入っていたから CRLF は LF+LF に変換されていたのだろうか。改行コードが二重に送信される問題はこの項目のチェックを外すことで解決した。
今後
とはいえ、実際にどのような改行コードが送信されているのか今ひとつハッキリしない。telnet.exe では CR を送信するようにした。PuTTY では CR を改行と扱わないようにした。CRLF はそのまま CRLF なのか? それなら telnet.exe の初期設定と同じで二重送信になるはずだ。では CR をカットして LF のみなのか。その場合は telnet.exe の CR とは異なる。結局これは通信時のパケットをキャプチャして確認するしかなさそうだ。パケットアナライザなんて、もう五年くらい使っていないが、やっぱり気になるので久しぶりにインストールしてみようかと思っている。
解決 其の弐
Analyzer 導入でパケットを解析してみた。結論からいうと "Return key sends..." のチェックを外すと二バイトのデータとして 0D 00 つまり CR のみが送られている。ちなみに telnet.exe では CR 送信設定で 0D のみの一バイトだったがこれは等価と見てよいだろう。反対にチェックを付けた場合は両者とも CRLF として 0D 0A が送られている。
結局のところ、"Return key sends Telnet New Line instead of ^M" の意味を取り違えていたために起こった混乱であった。前提とすべきは「PuTTY では Enter キーに CR が割り当てられている」ということ。それを CRLF に変更するための設定が "Return key sends..." だったわけである。
最終更新:2008年09月06日 23:10