2017-03-03 1 views
0

Tout d'abord. Je m'excuse pour l'extrait de code massif. Mais je suis sans espoir à ce stade, et j'ai besoin d'une réponse à ce que je fais mal.Obtention d'une exception d'objet avec des sockets

Je démarre le serveur, puis le client se connecte au serveur et clique sur se connecter pour authentifier son mot de passe. Mais la chose est. La première fois que j'envoie la demande, tout fonctionne parfaitement, mais la deuxième fois directement après la première tentative, lorsque j'appuie à nouveau sur le bouton de connexion. Je reçois

Exception lancée: 'System.ObjectDisposedException' dans System.dll

Je ne peux pas sembler comprendre où mon problème. J'ai également besoin d'aide là où je dois déconnecter l'utilisateur et tout ce qui reste de la maison.

Le code:

private byte[] _buffer = new byte[16 * 1024]; 
    static List<Socket> _connectedClients = new List<Socket>(); 
    private Socket _serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
    private IPEndPoint ipport = null; 
    private int port = 0; 


    private void SetupServer() 
    { 
     lstConnections.Items.Add("--==( Setting Up Server )==--"); 
     _serverSocket.Bind(ipport); 
     _serverSocket.Listen(38); 
     _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 
    } 

    private void AcceptCallback(IAsyncResult AR) 
    { 
     Socket socket; 
     try 
     { 
      //socket = (Socket)AR.AsyncState; 
      socket = _serverSocket.EndAccept(AR); 
     } 
     catch (ObjectDisposedException) 
     { 

      return; 
     } 

     _connectedClients.Add(socket); 
     socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket); 
     Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Client Connected, Waiting for request..."); }); 
     _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 
    } 

    private void RecieveCallback(IAsyncResult AR) 
    { 
     try 
     { 
      Socket socket = (Socket)AR.AsyncState; 
      int recieved = 0; 
      try 
      { 
       recieved = socket.EndReceive(AR); 

      } 
      catch (Exception exc) 
      { 
       FileHandlerTxt FHandler = new FileHandlerTxt(); 
       FHandler.appendDataToTextFile(new List<string> { string.Format("Client forcefully disconnected at {0}. Error : {1}", DateTime.UtcNow.ToLongDateString(), exc.Message) }); 
       socket.Close(); 
       _connectedClients.Remove(socket); 
       return; 
      } 

      byte[] dataBuffer = new byte[recieved]; 
      Array.Copy(_buffer, dataBuffer, recieved); 

      object unkown = dataBuffer.Deserialize(); 

      if (unkown is Login) 
      { 
       Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Got login request..."); }); 
       #region Login 
       Login login = (Login)unkown; 

          //Do stuff in the call Class 
          // .Serialize() is an extension method 

          byte[] data = call.Serialize(); 
          socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); 
          socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket); 
          Invoke((MethodInvoker)delegate { lstConnections.Items.Add(login.Username + " Signed in"); }); 
         } 
         else 
         { 
          MessageClass call = new MessageClass("Failed. Password incorrect"); 
          call.ckey = 2; 
          login.updateFailedAttempts(LoginAttempts + 1); 
          byte[] data = call.Serialize(); 
          socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); 
          socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket); 
         } 
        } 
        else 
        { 
         MessageClass call = new MessageClass("Failed. To many failed attempts"); 
         call.ckey = 4; 
         RootObject LocData = LocationData.getLocationData(); 
         string message = string.Format("You have entered your password wrong 3 times on {0} at {1} from {2}:{3}. Your account has been locked. Please go to the lodge to unlock your account.", DateTime.UtcNow.ToLongDateString(), DateTime.UtcNow.ToLongTimeString(), IPLocation.getIPAddress(), LocData.country); 
         message.SendEmail(); 
         byte[] data = call.Serialize(); 
         socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); 
         socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket); 
        } 

       } 
       else 
       { 
        MessageClass call = new MessageClass("Failed. User does not exists"); 
        call.ckey = 3; 
        byte[] data = call.Serialize(); 
        socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket); 
        socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket); 
       } 
       #endregion 
      } 
      else if (unkown is Client) 
      { 
       #region Client 
       Client newClient = (Client)unkown; 
       newClient.Queries(newClient.ckey); 
       Invoke((MethodInvoker)delegate 
       { 
        lstConnections.Items.Add("Did requested Client query"); 
       }); 

       #endregion 
      } 
      else if (unkown is MessageClass) 
      { 
       Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Got Disconnect request..."); }); 
       MessageClass call = (MessageClass)unkown; 
       if (call.ckey == -10) 
       { 
        socket.Shutdown(SocketShutdown.Both); 
        socket.Close(); 
        socket.Dispose(); 
        _connectedClients.Remove(socket); 
        Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Client Disconnected..."); }); 
        return; 
       } 
      } 


     } 
     catch (Exception exc) 
     { 
      FileHandlerTxt FHandler = new FileHandlerTxt(); 
      FHandler.appendDataToTextFile(new List<string> { string.Format("RecieveCallback problem at {0}. Error : {1}", DateTime.UtcNow.ToLongDateString(), exc.Message) }); 
     } 


    } 



    private void SendCallback(IAsyncResult AR) 
    { 
     Socket socket = (Socket)AR.AsyncState; 
     socket.EndSend(AR); 
    } 

Ensuite, il y a le côté client. Ce qui encore une fois, je l'espère est bien fait:

private void btnSignIn_Click(object sender, RoutedEventArgs e) 
    { 



     //Enable wat onder is vir Authentication 

     try 
     { 

      Login login = new Login(txtUsername.Text,passboxPassword.SecurePassword.EncryptPassword(txtUsername.Text),IPLocation.getIPAddress(),0); 
      _clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.14"),8081)); 
      _clientSocket.Send(login.Serialize()); 
      RecieveResponse(); 
     } 
     catch (SocketException se) 
     { 
      FileHandlerTxt FHandler = new FileHandlerTxt(); 
      FHandler.appendDataToTextFile(new List<string> { string.Format("Socket Exception {0} on {1}", se.Message, DateTime.UtcNow.ToLongDateString()) }); 
     } 
     catch (Exception exc) 
     { 
      FileHandlerTxt FHandler = new FileHandlerTxt(); 
      FHandler.appendDataToTextFile(new List<string> { string.Format("Exception {0} on {1}", exc.Message, DateTime.UtcNow.ToLongDateString()) }); 
     } 



    } 


    private void RecieveResponse() 
    { 
     byte[] buffer = new byte[2048]; 
     int recieved = _clientSocket.Receive(buffer, SocketFlags.None); 
     if (recieved == 0) return; 
     byte[] data = new byte[recieved]; 
     Array.Copy(buffer,data,recieved); 
     object unkown = data.Deserialize(); 
     MessageClass returnMessage = (MessageClass)unkown; 
     if (returnMessage.ckey == 1) 
     { 
      string AskingPasscode = ""; 
      RecievePasscode passauth = new RecievePasscode(); 
      if (passauth.ShowDialog() == false) 
      { 
       AskingPasscode = passauth.PassCode; 
      } 
      if (AskingPasscode == returnMessage.PassKey.DecryptPasscode(txtUsername.Text)) 
      { 
       if (returnMessage.AuthLevel == 2) 
       { 
        SESSION.AccountType = "Admin"; 
        SESSION.AuthLevel = 2; 
        SESSION.ID = returnMessage.client.ID; 
        SESSION.Name = returnMessage.client.Name; 
        MainWindow main = new MainWindow(); 
        main.Show(); 
        this.Close(); 
       } 
       else if (returnMessage.AuthLevel == 1) 
       { 
        SESSION.AccountType = "Hunter"; 
        SESSION.AuthLevel = 1; 
        SESSION.ID = returnMessage.client.ID; 
        SESSION.Name = returnMessage.client.Name; 
        MainWindow main = new MainWindow(); 
        main.Show(); 
        this.Close(); 
       } 
       else 
       { 
        SESSION.AccountType = "User"; 
        SESSION.AuthLevel = 0; 
        SESSION.ID = returnMessage.client.ID; 
        SESSION.Name = returnMessage.client.Name; 
        MainWindow main = new MainWindow(); 
        main.Show(); 
        this.Close(); 
       } 
      } 
     } 
     else 
     { 
      MessageBox.Show(returnMessage.Message); 
     } 

     MessageClass call = new MessageClass("Exit"); 
     call.ckey = -10; 
     _clientSocket.Send(call.Serialize()); 
     _clientSocket.Shutdown(SocketShutdown.Both); 
     _clientSocket.Close(); 
     _clientSocket.Dispose(); 
     MessageBox.Show("Client Disconnect."); 


    } 
+0

Obtenez-vous cette exception côté serveur ou côté client? – Tim

+0

Le programme ne casse pas sur ce problème. Mais selon mon erreur de manipulation. Il arrive du côté du client –

+0

Et puis il arrive dans le serveur aussi .. Je l'appelle suivre –

Répondre

0

Sur le côté client, vous _clientSocket dans RecieveResponse Mise au rebut, mais _clientSocket Semble est réutilisée par le bouton suivant, cliquez sur btnSignIn_Click. Cela provoquera certainement ObjectDisposedException

Vous devrez créer une nouvelle socket à chaque fois.

+0

je vois. Comment créer un nouveau socket chaque fois que le bouton est cliqué? Parce que lorsque j'appuie sur btnSignIn, j'envoie les informations de connexion à vérifier par le serveur. et l'envoyer un message au client pour dire que le client devrait continuer ou se connecter a échoué. –

+0

Le reste du code est-il correct? –