TcpListener에서 상속하는 클래스가 있습니다.이 클래스는 Start 메서드를 그림자 만 사용하여 Start() 및 BeginAcceptTcpClient()를 호출합니다. 때때로 메서드가 호출되지만 포트가 열리지 않습니다 (netstat에 포트가 열려 있음이 표시되지 않음).TcpListener.Start()가 포트를 열지 않습니다.
클래스는 일어나는 방법이나 문제를 디버깅하는 무슨에이
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
어떤 생각처럼 보인다? Start()가 예외없이 호출 되었기 때문에 포트가 항상 열려있는 것으로 예상됩니다 (로그는 항상 기록됩니다).
추가 정보 : Start 메소드가 잘 작동하면 앱이 다시 시작될 때까지 매번 작동합니다. Start 메소드가 작동하지 않으면 앱이 다시 시작될 때까지 다시 작동하지 않습니다.
편집 :
가Public Shadows Sub [Stop]()
SyncLock (m_stopLock)
MyBase.Stop()
My.Application.Log.WriteEntry("... extended Tcp Listener stopped", TraceEventType.Verbose)
End SyncLock
End Sub
ExtendedTcpListener을 사용하는 클래스는 IDisposable 패턴을 구현하고 폐기 내부의 ExtendedTcpListener.Stop가 호출 : 또한 ExtendedTcpListener에서 정지 방법이있다.
문제가 발생하면 로그에 중지 텍스트가 없습니다.
아니. "Extended Tcp Listener started ..."문자열이 작성되면 거기에 도달 할 때 잠금이 수행되지 않습니다. m_stopLock는, 개시 및 정지를 동시에 피하기 위해서, 주로 개시 및 정지 락으로서 사용되는 Object입니다. –
"디버거를보고 그림자 생성자가 호출되는지 확인할 수 있습니까?"라는 의미는 무엇입니까? 내 유일한 생성자가 Mybase.New()를 호출하기 때문에 항상 기본 생성자가 호출됩니다. –
그래서 이해합니다. 문제는 일부 코드가 실행되지 않는다는 것 (MyBase.BeginAcceptTcpClient (AddressOf Me.CompleteAcceptTcpClient, Me))입니다. 그러나 코드가 실행 되더라도 포트는 여전히 열려 있지 않습니다. 이 올바른지? – Ando