DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Socketクライアントで非同期接続タイムアウト時のソケット開放

環境/言語:[XPSP2、VBorC#,CLR2.0]
分類:[.NET]

こんにちは、うきょきょです。

Socketクラスを利用して、非同期接続を行っています。
タイムアウトが発生した時の、BeginXXXはどうなってしまうのでしょうか?

待ち受け状態(=マネージ ヒープを使用している?)のまま、GCで開放されるのか疑問になったので
教えてください。

#開放されるタイミングは(今は)気にしていません。
#開放される?/明記しないといけない?かが、知りたいです。

タイムアウトの方法は色々な掲示板等で書かれていますが、
下の参考に書いたサイトでも気にされているので、私も気になりました。

ちなみにタイムアウトは、ManualResetEvent.WaitOne(Int32, Boolean)で行っております。

よろしくお願いします。

P.S.
セキュリティの関係で、ソースの掲載が出来ませんが、
出来る限り対応します。よろしくお願いします。

環境
WinXPSP2
C# 2005 Expres

参考
「宇宙仮面のC# プログラミング」の「WinPing」
http://ukamen.hp.infoseek.co.jp/Programming1/WinPing/index.htm
■No22182に返信(うきょきょさんの記事)

BeginReceiveFromのあとWaitOneで一定時間ブロックして、それでも受信できなかった時にEndReceiveFromを呼び出すと止まってしまうということですね。これは多分単純にEndReceiveFromがデータを受信するまでブロックしているということではないでしょうか。もしそうであれば、このような方法はタイムアウトのやり方としては正しくない様に思えます。どうしても終了させるのであれば、Closeで閉じた方が良いのではないでしょうか?

もしBeginReceiveFromのあとすぐにWaitOneを呼び出すのであれば、そもそも非同期メソッドを使う必要があるのかも疑問です。Socket.SetSocketOptionメソッドでタイムアウト時間を設定して、同期メソッドで行った方が良いのではないでしょうか。
■No22187に返信(管理人さんの記事)
> ■No22182に返信(うきょきょさんの記事)
>
> BeginReceiveFromのあとWaitOneで一定時間ブロックして、それでも受信できなかった時にEndReceiveFromを呼び出すと止まってしまうということですね。これは多分単純にEndReceiveFromがデータを受信するまでブロックしているということではないでしょうか。もしそうであれば、このような方法はタイムアウトのやり方としては正しくない様に思えます。どうしても終了させるのであれば、Closeで閉じた方が良いのではないでしょうか?

あぁぁぁ。すみません。

> Closeで閉じた方が良いのではないでしょうか?
この文でMSDNを見直したところ、Socket.BeginReceiveFrom メソッドで見落としがありました。

>保留中の BeginReceiveFrom をキャンセルするには、Close メソッドを呼び出します。
そのものずばりの、一文が書いてありました。

疑問に思って、ググって、参考に書いたサイトみて、MSDNに書かれていないと勝手に思ってしまいました。

Socket.Shutdown後に、Socket.Closeを行っているため、疑問のリソースの開放は
正しく行われると確信できました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板