C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Socket(TCP)のクローズ処理について


(過去ログ 74 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■43394 / inTopicNo.1)  Socket(TCP)のクローズ処理について
  
□投稿者/ karuma (1回)-(2009/11/09(Mon) 20:41:49)

分類:[VB.NET/VB2005 以降] 

開発環境:Windows Vista
開発言語:VB2008

いつもお世話になっております。
以前ソケット通信について指導をうけましたが、
今回はその破棄方法について相談があります。

とあるフォームのボタン押下イベントで以下のメソッドが実行されます。
(以下のメソッドのみ実行されます。)

    Public Sub SocketClose()
        SyncLock Me.syncSocket

            If Not Me._socket Is Nothing Then
                If Me._socket.Connected = True Then
                   
                    ' 'ソケットを閉じる
                    Me._socket.Shutdown(Sockets.SocketShutdown.Both)
                    Me._socket.Close()
                End If
                Me._socket = Nothing
            End If

            If Not (Me._receivedBytes Is Nothing) Then
              
                Me._receivedBytes.Close()
                Me._receivedBytes = Nothing
            End If

        End SyncLock
        ' 'ソケット切断イベントを発生
        Me.Disconnected(New EventArgs)
    End Sub

変数については

    Private _socket As Sockets.Socket
    Private _receivedBytes As System.IO.MemoryStream
    Protected ReadOnly syncSocket As New Object

以上のソースはDOBON.NET様のサイトを利用させていただきました。
上記メソッドのうち、End SyncLockの処理後
System.NullReferenceExceptionの初回例外が発生します。
End SyncLockの前後でsyncSockeがnothing等になっていたり、
クラスが破棄されていないか確認したのですが、
そうではありませんでした。

初心者の学習用のソースですが、何卒ご教授願います。

引用返信 編集キー/
■43397 / inTopicNo.2)  Re[1]: Socket(TCP)のクローズ処理について
□投稿者/ オショウ (380回)-(2009/11/09(Mon) 22:22:03)
No43394 (karuma さん) に返信
> 初心者の学習用のソースですが、何卒ご教授願います。

  SyncLock を多用されてますか?

  私も過去、使ったことありますが、原因不明な現象が発生し
  SyncLockを、ReaderWriterLockに変更したら、おさまったと
  言う経験があります。

以上。参考まで・・・
引用返信 編集キー/
■43398 / inTopicNo.3)  Re[2]: Socket(TCP)のクローズ処理について
□投稿者/ karuma (2回)-(2009/11/09(Mon) 22:49:39)
No43397 (オショウ さん) に返信

返信ありがとうございます。


>   SyncLock を多用されてますか?

多用、というほどではないと思いますが、
SendのタイミングとReceive(非同期)のタイミングでも使用しています。


>   私も過去、使ったことありますが、原因不明な現象が発生し
>   SyncLockを、ReaderWriterLockに変更したら、おさまったと
>   言う経験があります。
> 
> 以上。参考まで・・・

むむむ…
そうなのですか…残念です。ReaderWriterLockだと
常にWriterとして使用すればSyncLockと同等の処理が行えるのでしょうか?




話は変わりますが、SyncLockの処理って

        Try
            System.Monitor.Enter(Me)

        Finally
            System.Monitor.Exit(Me)
        End Try

とありましたが、
System.Monitorとは何でしょうか?
あまり情報が無いように思いますが…(無知ですみません)

引用返信 編集キー/
■43400 / inTopicNo.4)  Re[3]: Socket(TCP)のクローズ処理について
□投稿者/ 魔界の仮面弁士 (1378回)-(2009/11/09(Mon) 23:06:42)
No43398 (karuma さん) に返信
> System.Monitorとは何でしょうか?
System.Threading.Monitor の誤記です。
(.NET 1.x 当時、公式文書で System.Monitor と記述されていたものがありました)

SyncLock と Monitor の比較について、こちらが参考になるかも。
http://msdn.microsoft.com/en-us/magazine/cc163846.aspx
http://www.seosoft.net/weblog/dotnet/2005/05/monitorsynclock.html
引用返信 編集キー/
■43401 / inTopicNo.5)  Re[4]: Socket(TCP)のクローズ処理について
□投稿者/ karuma (3回)-(2009/11/09(Mon) 23:22:17)
No43400 (魔界の仮面弁士 さん) に返信

返信ありがとうございます。


> System.Threading.Monitor の誤記です。
> (.NET 1.x 当時、公式文書で System.Monitor と記述されていたものがありました)
> 
> SyncLock と Monitor の比較について、こちらが参考になるかも。
> http://msdn.microsoft.com/en-us/magazine/cc163846.aspx
> http://www.seosoft.net/weblog/dotnet/2005/05/monitorsynclock.html
貴重な情報ありがとうございます!!!

System.Threading.Monitor.Enterと
System.Threading.Monitor.ExitをSyncLockの代わりに使用してみたり、

オショウ 様に教わったReaderWriterLockを使用してみましたが、
どうしてもSystem.NullReferenceExceptionが消えません。
(デバッグで時間をかけながらトレースすると出ませんが、一気に流すと出ます。。。)

これは、私のソースが根本的におかしいのかもしれません。
(クローズ処理後、受信メソッドでクローズ判定され再度クローズ処理が呼ばれますが、
そのためにロックをかけているはず…)

もしかすると、スレッド違いのせいでしょうか?
最初にクローズ処理を行うのはボタンイベントのメインスレッドですが、
再度クローズ処理を呼ぶのは非同期(BeginReceive)スレッドからです。

いや、関係ないですよね…
うう〜〜ん…自信ありません。

上記情報を眺めながら、もうちょっと悩んでみます。

引用返信 編集キー/
■43402 / inTopicNo.6)  Re[5]: Socket(TCP)のクローズ処理について
□投稿者/ オショウ (381回)-(2009/11/10(Tue) 04:00:47)
No43401 (karuma さん) に返信
> どうしてもSystem.NullReferenceExceptionが消えません。
> (デバッグで時間をかけながらトレースすると出ませんが、一気に流すと出ます。。。)
>
> これは、私のソースが根本的におかしいのかもしれません。
> (クローズ処理後、受信メソッドでクローズ判定され再度クローズ処理が呼ばれますが、
> そのためにロックをかけているはず…)
>
> もしかすると、スレッド違いのせいでしょうか?
> 最初にクローズ処理を行うのはボタンイベントのメインスレッドですが、
> 再度クローズ処理を呼ぶのは非同期(BeginReceive)スレッドからです。
>
> いや、関係ないですよね…
> うう〜〜ん…自信ありません。

  私もソケット通信のコード書いてますが・・・
  わざわざそういうコーディングしなくても、全く問題なく
  できてますヨ!

  排他制御が問題ではなく、基本的なコーディングに問題が
  あるのでは・・・

  ソケット通信の全体像が解りませんので、コメントのしよ
  うがありません。

以上・・・
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -