8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TCPClientはアプリケーション終了時にFINを送信しない

Last updated at Posted at 2014-06-05

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()が呼び出されれば、内部的に正常に処理されるので安心してください(想像)

この件から私が得るべき教訓

何の調査もせず、実際の動きから想像でものをいうと、本来のあるべき姿とは別の方向に読者さんを導いてしまうので、ある程度調査した後にレポートすべきですね。今回は多くの方々に混乱を与えてしまったことをここにお詫びします。

8
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?