.NET非同期通信の切断

今日も今日とて.NET。.NETで非同期ソケット通信Link (←このリンクが切れていた場合、".NET", "ソケット", "非同期"などで検索すれば出てくるでしょう)する場合、データを受信するたびにSystem.Net.Sockets.Socket.BeginReceiveで指定した関数・メソッドが呼ばれます。接続が切れるときにもこの関数が呼ばれますが、その場合受信サイズが0になっているので、切断を知ることができるという仕掛けです。

相手から切断してきたときはSystem.Net.Sockets.Socket.Close()なりインスタンスの破棄なり処理すればいいのですが、こちらから切断したいときはSystem.Net.Sockets.Socket.Disconnect()で切断する必要があるようです。以下の方法では不具合がありました。

System.Net.Sockets.Socket.Socketインスタンスの破棄
破棄のタイミングはプログラマーが制御できないLink ようなのでいつ切断されるか分かりません。下手すると延々と接続されています。
System.Net.Sockets.Socket.Socket.Close()
このメソッドは切断後全てのリソースを開放してしまいますLink 。この後サイズ0の受信を通知しようとBeginReceiveで指定した関数が呼ばれますが、引数のIAsyncResultクラスインスタンスがCloseメソッドで開放されてしまっているため、EndReceiveでこのインスタンスにアクセスするとエラーを起こします。try〜catchで例外処理など対策が必要。

ただSystem.Net.Sockets.Socket.Socket.Disconnect()メソッドは.NET Framework 2.0以降らしいので、1.xではEndReceiveをtry〜catchで捕まえるか、独自にフラグ管理するなどするしかないのでしょうか?

— posted by mu at 08:51 pm   commentComment [0]  pingTrackBack [0]

この記事に対する TrackBack URL:

設定によりTB元のページに、こちらの記事への言及(この記事へのリンク)がなければ、TB受付不可となりますのであらかじめご了承下さい。

コメントをどうぞ。 名前(ペンネーム)と画像認証のひらがな4文字は必須で、ウェブサイトURLはオプションです。

ウェブサイト (U):

タグは使えません。http://・・・ は自動的にリンク表示となります

:) :D 8-) ;-) :P :E :o :( (TT) ):T (--) (++!) ?;w) (-o-) (**!) ;v) f(--; :B l_P~ (QQ)

     

[X] [Top ↑]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0182 sec.
prev
2007.7
next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31