WPFでアプリケーションを終了するとき、相手にRSTを送信する
TCPClientでコネクションを確立させた後、おもむろにアプリケーションを閉じると、通信回線上ではRSTが送信されます。これはTCPの仕様上きれいな終わり方ではないようです。
WPFでアプリケーションを終了するときに、相手にFINを送信するようにする
WPFアプリケーションはクローズボタンが押された後、いくつかのイベントが発生してから完全に終了します。
Windows Form アプリではリソースの解放を行うのに Disposed イベントがあったのですが、WPFには無いようなので、Closed イベントを代替メソッドとして TCPClient.Close()を呼ぶようにします。
そうすると、アプリ終了時にTCPClientもクローズされるので、めでたくFINパケットが送信されます。
Shutdownは? 呼ばなくていいの?
TCPClient.Close()を呼ぶと、内部的にDispose()が呼ばれます。Dispose()の中でSocketのInternalShutdownメソッドを呼んでおり、その中でShutdownメソッドを呼んでいるようです(想像なので、もしかしたら違うかも)
ですので、TCPClient.Close()が呼び出されれば、内部的に正常に処理されるので安心してください(想像)
この件から私が得るべき教訓
何の調査もせず、実際の動きから想像でものをいうと、本来のあるべき姿とは別の方向に読者さんを導いてしまうので、ある程度調査した後にレポートすべきですね。今回は多くの方々に混乱を与えてしまったことをここにお詫びします。