2011-01-16 12 views
0
  1. 私は送受信にソケット(ソケットA =新しいソケット...)を使用しています。
  2. 古いオブジェクトをクローズ/廃棄しようとしていて、新しいソケット(A =新しいソケット...)(同じホスト/ポート)をインスタンス化しようとしています
  3. connect()リモートホストが接続を認識します。非常に最初のバイトを送信しようとしたら
  4. 、私はすぐに取得:

System.ObjectDisposedException:破棄されたオブジェクトにアクセスできません。 オブジェクト名: 'System.Net.Sockets.Socket'。 System.Net.Sockets.Socket.Send(Byte [] buffer、Int32 offset、Int32 size、SocketFlags socketFlags、SocketError & errorCode) at System.Net.Sockets.Socket.Send(Byte [] buffer、Int32 offset、 INT32サイズ、socketFlags socketFlags)System.Net.Sockets.Socket.Send(バイト[]バッファに )再オープンされたソケットを介して送信しようとしたときのObjectDisposeException

任意のアイデア?

try 
{ 
    CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); 
    CCMSocket.Connect(CCMServer, CCMPort); 
} 

ソケットで作業する場合さて、catch節はSocketExceptionをキャッチし、再接続メソッドを呼び出します。

try 
{ 
    //Verify the the socket is actually disconnected 
    byte[] Empty = new byte[0]; 
    CCMSocket.Send(Empty); 
} 
catch (Exception ex) 
{ 
    bool connected = false; 
    int reconnectCounter = 0; 
    do 
    { 
     reconnectCounter++; 
     Disconnect(); //<-- Just CCMSocket.Disconnect(true) in a try/catch 
     if (Connect(CCMServer, CCMPort)) // <-- method given above 
     { 
      connected = true; 
      CCMSocket.Send(LoginData); // this fails 
     } 
    } while (!connected);  
} 
+1

あなたのコードを見て、あなたのオブジェクトをどのように処分しているか見ることができます。 –

+1

あなたは同じ参照を使用しているように、いくつかのコード抽出を投稿できますか? – djeeg

+0

'Socket'オブジェクトに対して' using'ブロックをどこにでも使っていますか? – abatishchev

答えて

1

あなたのConnectメソッドは、新しいソケットを作成してもらうと、送信するためにそのソケットを返しますデータ。以上のような 何か:サーバーアプリケーションを構築する際

try 
{ 
    CCMSocket = new Socket(); 
    CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true); 
    CCMSocket.Connect(CCMServer, CCMPort); 
    return CCMSocket 
} 

do 
{ 
    reconnectCounter++; 
    Disconnect(); //<-- Just CCMSocket.Disconnect(true) in a try/catch 
    var newSocket = Connect(CCMServer, CCMPort); // <-- method given above 
    if (newSocket != null) 
    { 
     connected = true; 
     newSocket.Send(LoginData); // should work 
     CCMSocket = newSocket; // To make sure existing references work 
    } 
} while (!connected); 

あなたはまた、真剣にasynchronous socket pattern検討すべきです。

関連する問題