Pourquoi est-ce que streamreader est connecté à networkstream et renvoie null sur ReadLine ()?

Dans le code ci-dessous, j’ai un StreamReader qui lit un stream réseau. Ce code fonctionnera normalement pendant des jours. J’ai rencontré un problème où tout à coup, StreamReader.ReadLine () a commencé à retourner null.

Selon la documentation Microsoft, StreamReader.ReadLine () retournera la valeur null une fois la fin du stream d’entrée atteinte. Cela n’a pas de sens pour moi lorsque le stream sous-jacent est un NetworkStream. ReadLine () ne devrait-il pas simplement bloquer jusqu’à ce que le stream réseau reçoive des données?

C’est la première fois que je rencontre ce problème et je n’ai pas été en mesure de le dupliquer. Qu’est-ce qui pourrait causer ça?

Contexte: l’application reçoit les enregistrements CDR d’un commutateur téléphonique. Le commutateur téléphonique se connecte à l’application et envoie les anciens enregistrements de texte en clair. Une fois le commutateur connecté, il restra connecté et continuera à envoyer des enregistrements pour l’éternité, à moins que quelque chose ne se casse.

private void ProcessClient(TcpClient client) { try { using (NetworkStream stream = client.GetStream()) { using (StreamReader reader = new StreamReader(stream)) { //continue processing while service is on while (m_RunService & client.Connected) { ssortingng curLine = reader.ReadLine(); //code here does stuff to ssortingng //will catch any exceptions that have to do with //processing the ssortingng } } } } catch (Exception ex) { //write to log } } 

Voici le code qui lance l’auditeur:

  private void Listen() { try { while (m_RunService) { try { m_TcpClient = m_TcpListener.AcceptTcpClient(); //run on same thread, should only ever be 1 cnx at a time ProcessClient(m_TcpClient); } catch (Exception ex) { //write to log } finally { m_TcpClient.Close(); } } } finally { m_TcpListener.Stop(); } } 

StreamReader bloquera jusqu’à ce qu’il reçoive des données ou que la connexion soit fermée. Cela ressemble à une exception survenue côté serveur, la connexion a été fermée et le côté client n’a reçu aucune donnée.

Cela ressemble assez à la fermeture du stream. Sinon oui: ça bloquerait. Mon hypothèse: réseau # échec

Si NetworkStream ne dispose pas de données, l’appel à ReadLine() retournera la valeur null car il suppose qu’il a atteint la fin du stream.

Essayez de vérifier NetworkStream.CanRead et NetworkStream.DataAvailable avant d’appeler ReadLine . Si la connexion ne s’est pas fermée, bloquez manuellement pendant un certain temps, puis relancez la lecture.

EDIT Vous pouvez vérifier si la connexion est toujours ouverte en effectuant un Send ou en utilisant le Socket sous-jacent:

La propriété Connected obtient l’état de la connexion du socket à partir de la dernière opération d’E / S. Lorsqu’il renvoie false, le socket n’a jamais été connecté ou n’est plus connecté.

La valeur de la propriété Connected reflète l’état de la connexion à partir de l’opération la plus récente. Si vous devez déterminer l’état actuel de la connexion, effectuez un appel d’envoi non bloquant, de zéro octet. Si l’appel aboutit ou génère un code d’erreur WAEWOULDBLOCK (10035), le socket est toujours connecté; sinon, la prise n’est plus connectée.