TcpListener.Start()不会打开该端口

时间:2010-03-02 10:35:46

标签: .net vb.net network-programming tcplistener

我有一个继承自TcpListener的类,这个类Shadows Start方法只是为了调用基类Start()和基类BeginAcceptTcpClient()。有时会调用该方法,但端口未打开(netstat不显示端口打开)。

该课程看起来像这样

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方法不起作用,则在重新启动应用程序之前它将无法再次运行。

编辑:ExtendedTcpListener还有一个Stop方法:

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模式,并在Dispose内部调用ExtendedTcpListener.Stop。

发生问题时,日志中不会显示停止文本。

4 个答案:

答案 0 :(得分:0)

可能是在第一次调用Start之后,其他方法/线程获取了对m_stopLock的锁定? (什么类型的对象是m_stopLock?)

您可以查看调试器并查看是否调用了阴影构造函数? (或在SynchLock之前设置跟踪)

答案 1 :(得分:0)

你不是要过早处理这个物体吗?

我们能看到你创建ExtendedTcpListener实例的代码,以及你如何管理它?

答案 2 :(得分:0)

这很奇怪,好吧。据我了解,一旦问题开始出现,您可以轻松复制,对吧?如果是这样,我会在那时将调试器附加到它并检查TcpListener对象及其底层Socket(m_ServerSocket)。我在这里没有精确的说明,你只需要查看它,看看是否有什么东西看起来不合适或与事情发生时的方式不同。

答案 3 :(得分:0)

您继承TcpListener并使用Shadows覆盖非虚方法对我来说非常危险。您是否尝试将代码更改为不从TcpListener继承,而只是封装它?

编辑:添加了示例代码

Public Class ExtendedTcpListener
  ' Inherits System.Net.Sockets.TcpListener <== DO NOT INHERIT

  Private MyTcpListener As New TcpListener()

  Public Sub Start()
    SyncLock (m_stopLock)
      MyTcpListener.Start()
      MyTcpListener.BeginAcceptTcpClient(AddressOf Me.CompleteAcceptTcpClient, Me)
      My.Application.Log.WriteEntry("Extended Tcp Listener started ...", TraceEventType.Verbose)
    End SyncLock
  End Sub

  ' ...
End Class