Arjuna Aircraft Ident.: F-MBSD | Ca inspire toujours les foules, c'est fou
J'ai fait quelques modifs au niveau des logs, et j'ai plus d'infos sur ce qu'il se passe.
Apparement :
- Après émission de données, mon socket part bel et bien en live : pour le service, il est toujours en train d'écouter, alors que ce n'est pas le cas
- Lorsque je cherche à détruire mon socket, j'ai un problème de parcours de la collection dans laquelle il est stocké, et c'est ça qui fait l'erreur durant le nettoyage
- Lorsque j'arrête le service, on socket qui n'est plu censé être actif reprends la main puis s'arrêté.
Log :
29/12/2005 09:33:20 II : Données reçues
29/12/2005 09:33:20 II : Lecture des données reçues
29/12/2005 09:33:20 II : Données reçues trouvées, on les stocke dans un coin
29/12/2005 09:33:20 II : Il n'y a plus rien à recevoir
29/12/2005 09:33:20 II : Je réponds un A/R
29/12/2005 09:33:20 II : Envoie d'un message
29/12/2005 09:33:20 II : J'efface le buffer de réception
29/12/2005 09:33:20 II : Emission de données
29/12/2005 09:37:46 II : Nettoyage des sockets inactifs
29/12/2005 09:37:46 II : Socket dans un état de timeout trouvé : on le détruit (ID=)
29/12/2005 09:37:46 II : Destruction d'un socket
29/12/2005 09:37:46 II : Etat du socket détruit
29/12/2005 09:37:46 II : Socket en cours de travail, on le kill
29/12/2005 09:37:46 II : Socket killé
29/12/2005 09:37:46 II : Socket détruit
29/12/2005 09:37:46 II : Socket détruit
29/12/2005 09:37:46 ee : Plantate durant le nettoyage des sockets inactifs
29/12/2005 09:37:46 ee : La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.
29/12/2005 09:37:46 ee : at System.Collections.ArrayListEnumeratorSimple.MoveNext()
at MagicTalkServer.Server.CheckSockets(Object eventState)
29/12/2005 09:37:46 II : Fin du nettoyage des sockets
29/12/2005 09:42:46 II : Nettoyage des sockets inactifs
29/12/2005 09:42:46 II : Fin du nettoyage des sockets
29/12/2005 09:43:07 II : Arrêt du service
29/12/2005 09:43:07 II : Arrêt demandé, destruction de tous les sockets
29/12/2005 09:43:08 II : Demande de connection reçue
29/12/2005 09:43:08 II : Socket a terminé l'écoute
29/12/2005 09:43:08 II : Fin d'écoute
29/12/2005 09:43:08 II : Etablissement de la connection
29/12/2005 09:43:08 II : Connection établie, début de l'écoute
|
Fonctions incriminée :
Code :
- ///
- /// Decription: Call back method to handle incoming data.
- ///
- /// <param name="ar">Status of an asynchronous operation.</param>
- protected void ReadCallback(IAsyncResult ar)
- {
- log.AddMessage("Données reçues" );
- String content = String.Empty;
- // Retrieve the state object and the handler socket
- // from the async state object.
- StateObject state = (StateObject) ar.AsyncState;
- Socket handler = state.workSocket;
- try
- {
- log.AddMessage("Lecture des données reçues" );
- // Read data from the client socket.
- int bytesRead = handler.EndReceive(ar);
- if (bytesRead > 0)
- {
- log.AddMessage("Données reçues trouvées, on les stocke dans un coin" );
- // There might be more data, so store the data received so far.
- Monitor.Enter(state);
- state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
- Monitor.Exit(state);
- // Check for end-of-file tag.
- // If it is not there, read more data.
- content = state.sb.ToString();
- if (content.IndexOf("^^" ) > -1)
- {
- log.AddMessage("Il n'y a plus rien à recevoir" );
- // All the data has been read from the
- // client. Display it on the console.
- //Console.WriteLine("Read {0} bytes from socket.\nData: {1}",
- // content.Length, content);
- // Process the received message
- state.TimeStamp = DateTime.Now;
- log.AddMessage("Je réponds un A/R" );
- Send(state.workSocket, "yo\n" );
- //HandleMessages(state, content);
- // Echo the data back to the client.
- // Send(state, content);
- log.AddMessage("J'efface le buffer de réception" );
- state.sb.Length = 0;
- }
- else
- {
- log.AddMessage("J'ai pas encore tout reçu, j'attends encore" );
- // Not all data received. Get more.
- handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(this.ReadCallback), state);
- }
- }
- else
- { // Disconnected
- log.AddBlockingError("Déconnection avant la fin de la transmission." );
- RemoveSocket(state);
- }
- }
- catch (System.Net.Sockets.SocketException es)
- {
- log.AddBlockingError("Erreur réseau", es);
- RemoveSocket(state);
- if (es.ErrorCode != 64)
- {
- log.AddBlockingError(string.Format("ReadCallback Socket Exception: {0}, {1}.", es.ErrorCode, es.ToString()));
- }
- }
- catch (Exception e)
- {
- log.AddBlockingError("Erreur inconnue", e);
- RemoveSocket(state);
- if (e.GetType().FullName != "System.ObjectDisposedException" )
- {
- log.AddMessage(string.Format("ReadCallback Exception: {0}.", e.ToString()));
- }
- }
- }
- ///
- /// Description: Check for dormant sockets and close them.
- ///
- /// <param name="eventState">Required parameter for a timer call back
- /// method.</param>
- private void CheckSockets(object eventState)
- {
- log.AddMessage("Nettoyage des sockets inactifs" );
- lostTimer.Change(System.Threading.Timeout.Infinite,
- System.Threading.Timeout.Infinite);
- try
- {
- foreach (StateObject state in connectedSocks)
- {
- if (state.workSocket == null)
- { // Remove invalid state object
- log.AddWarning(string.Format("Socket dans un état invalide trouvé : on le détruit (ID={0})", state.id));
- Monitor.Enter(connectedSocks);
- if (connectedSocks.Contains(state))
- {
- log.AddWarning("Le socket à détruire est bien trouvé" );
- connectedSocks.Remove(state);
- Interlocked.Decrement(ref sockCount);
- log.AddWarning("Le socket à détruire est bien détruit" );
- }
- else
- {
- log.AddNonBlockingError("On ne trouve plus le socket à détruire !" );
- }
- Monitor.Exit(connectedSocks);
- log.AddWarning(string.Format("Socket {0} détruit", state.id));
- }
- else
- {
- if (DateTime.Now.AddTicks(-state.TimeStamp.Ticks).Minute > timeoutMinutes)
- {
- log.AddMessage(string.Format("Socket dans un état de timeout trouvé : on le détruit (ID={0})", state.id));
- RemoveSocket(state);
- log.AddMessage(string.Format("Socket {0} détruit", state.id));
- }
- }
- }
- }
- catch (Exception e)
- {
- log.AddNonBlockingError("Plantate durant le nettoyage des sockets inactifs", e);
- }
- finally
- {
- log.AddMessage("Fin du nettoyage des sockets" );
- lostTimer.Change(Server.timerTimeout, Server.timerTimeout);
- }
- }
- ///
- /// Decription: Stop the threads for the port listener.
- ///
- public void Stop()
- {
- log.AddMessage("Arrêt demandé, destruction de tous les sockets" );
- int lcv;
- lostTimer.Dispose();
- lostTimer = null;
- for (lcv = 0; lcv < numThreads; lcv++)
- {
- if (!serverThread[lcv].IsAlive)
- threadEnd[lcv].Set(); // Set event if thread is already dead
- }
- ShuttingDown = true;
- // Create a connection to the port to unblock the listener thread
- Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, this.portNumber);
- sock.Connect(endPoint);
- //sock.Close();
- sock = null;
- // Check thread end events and wait for up to 5 seconds.
- for (lcv = 0; lcv < numThreads; lcv++)
- threadEnd[lcv].WaitOne(5000, false);
- }
- ///
- /// Decription: Call back method to accept new connections.
- ///
- /// <param name="ar">Status of an asynchronous operation.</param>
- private void AcceptCallback(IAsyncResult ar)
- {
- log.AddMessage("Demande de connection reçue" );
- // Signal the main thread to continue.
- allDone.Set();
- // Get the socket that handles the client request.
- Socket listener = (Socket) ar.AsyncState;
- Socket handler = listener.EndAccept(ar);
- // Create the state object.
- StateObject state = new StateObject();
- state.workSocket = handler;
- state.TimeStamp = DateTime.Now;
- try
- {
- log.AddMessage("Etablissement de la connection" );
- Interlocked.Increment(ref sockCount);
- Monitor.Enter(connectedSocks);
- connectedSocks.Add(state);
- Monitor.Exit(connectedSocks);
- log.AddMessage("Connection établie, début de l'écoute" );
- handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(this.ReadCallback), state);
- if (sockCount > this.maxSockets)
- {
- log.AddBlockingError("Trop de connections, on détruit la connection" );
- RemoveSocket(state);
- //handler.Shutdown(SocketShutdown.Both);
- //handler.Close();
- handler = null;
- state = null;
- }
- }
- catch (SocketException es)
- {
- log.AddBlockingError("Impossible d'établir la connection", es);
- RemoveSocket(state);
- }
- catch (Exception e)
- {
- log.AddBlockingError("Impossible d'établir la connection (2)", e);
- RemoveSocket(state);
- }
- }
|
D'après le log, c'est la dernière fonction qui était restée blockée (certainement sur le allDone.Set()) et qui se débloque lors de l'arrêt du service. |