2011-01-16 17 views
0
  1. Ich benutze Socket (Socket A = neue Socket ...) zu senden/zu empfangen.
  2. , wenn etwas passiert, Bett (Trennung), ich versuche/entsorgen altes Objekt zu schließen, und dann eine neue Buchse (A = new Socket ...) (gleich Host/Port)
  3. Die connect Instancing() Phase überprüft gut, der Remote-Host sieht die Verbindung.
  4. Beim Versuch, das erste Byte zu senden, erhalte ich sofort:

System.ObjectDisposedException: keine angeordneten Objekt zugreifen können. Objektname: 'System.Net.Sockets.Socket'. bei System.Net.Sockets.Socket.Send (Byte [] Puffer, Int32-Offset, Int32-Größe, SocketFlags SocketFlags, SocketError & errorCode) bei System.Net.Sockets.Socket.Send (Byte [] Puffer, Int32-Offset, Int32 Größe, Socketsocket) bei System.Net.Sockets.Socket.Send (Byte [] Puffer)ObjectDisposeException beim Versuch, durch einen wiedereröffneten Socket zu senden

Irgendwelche Ideen?

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

Nun, wenn es mit der Steckdose arbeiten, die catch-Klausel fängt SocketException und ruft die Reconnect-Methode:

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

Können wir uns Ihren Code ansehen, um zu sehen, wie Sie Ihre Objekte entsorgen. –

+1

können Sie einige Code-Extrakte posten, klingt, als ob Sie die gleiche Referenz verwenden – djeeg

+0

Verwenden Sie 'using' Block gegen' Socket' Objekt irgendwo? – abatishchev

Antwort

1

Haben Sie Ihre Connect-Methode eine neue Buchse erstellen und diese Buchse zurückkehren senden Daten. Etwas mehr wie:

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

und

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); 

Sie sollten auch die asynchronous socket pattern ernsthaft in Erwägung ziehen, wenn Server-Anwendungen zu bauen.