J'ai une classe qui hérite de TcpListener, cette classe Shadows la méthode Start juste pour appeler la base Start() et la base BeginAcceptTcpClient(). De temps en temps, la méthode est appelée mais le port n'est pas ouvert (netstat n'affiche pas le port ouvert).TcpListener.Start() n'ouvre pas le port
La classe ressemble à ceci
Public Class ExtendedTcpListener
Inherits System.Net.Sockets.TcpListener
Public Shadows Sub Start()
SyncLock (m_stopLock)
MyBase.Start()
MyBase.BeginAcceptTcpClient(AddressOf Me.CompleteAcceptTcpClient, Me)
My.Application.Log.WriteEntry("Extended Tcp Listener started ...", TraceEventType.Verbose)
End SyncLock
End Sub
Toute idée sur ce qui se passe ou comment déboguer le problème? Comme le Start() est appelé sans exception je m'attendais à trouver le port toujours ouvert (le journal est toujours écrit).
Informations supplémentaires: lorsque la méthode Start fonctionne correctement, elle fonctionne à chaque fois jusqu'à ce que l'application soit redémarrée. Lorsque la méthode Start ne fonctionne pas, elle ne fonctionnera plus tant que l'application ne sera pas redémarrée.
Edit: Il y a aussi une méthode d'arrêt au ExtendedTcpListener:
Public Shadows Sub [Stop]()
SyncLock (m_stopLock)
MyBase.Stop()
My.Application.Log.WriteEntry("... extended Tcp Listener stopped", TraceEventType.Verbose)
End SyncLock
End Sub
La classe qui utilise le ExtendedTcpListener implémente le modèle IDisposable et à l'intérieur du Éliminez le ExtendedTcpListener.Stop est appelé.
Le texte d'arrêt n'est pas présent dans les journaux lorsque les problèmes se produisent.
Non. Au fur et à mesure que la chaîne "Extended Tcp Listener started ..." est écrite, le verrou n'est pas pris à l'arrivée. Le m_stopLock est un objet utilisé principalement comme verrou de démarrage et d'arrêt, pour éviter le démarrage et l'arrêt en même temps. –
Que voulez-vous dire par "Pouvez-vous regarder avec le débogueur et voir si le constructeur de l'observation est appelé?". Le constructeur de base est toujours appelé parce que mon seul constructeur appelle Mybase.New() –
Pour que je comprenne: le problème n'est pas que du code ne soit pas exécuté (MyBase.BeginAcceptTcpClient (AddressOf Me.CompleteAcceptTcpClient, Me)), ce que je pensais - mais que bien que le code soit exécuté, le port n'est toujours pas ouvert. Est-ce correct? – Ando