如何礼貌地停止TcpListener?

时间:2015-04-29 14:19:52

标签: vb.net multithreading tcplistener

我有一个可以正常运行的TCP服务器,但现在我需要以安全的方式停止它和所有线程。 到目前为止我研究Abort方法还不行

我调试了,当服务器启动并且没有连接时,似乎代码在行上停止

Server = New TcpListener(IPAddress.Any, Port)

因此,当我调用StopServer时,我收到有关WSACancelBlokingCall的错误 我无法弄清楚如何正确停止服务器。

这是完成的代码,除了StartTcpClient是收到的数据。

#Region "TCP Receive variables"
    Dim TcpOpen As Boolean = False
    Private Server As TcpListener = Nothing
    Private ServerThread As Thread = Nothing
    Friend AckString As String = ""
#End Region

#Region "TCP"
    Public Sub StopServer()
        Server.Stop()
        ServerThread.Abort()
        TcpOpen = False
    End Sub
    Public Sub InitServer(ByVal Port As Integer)
        Server = New TcpListener(IPAddress.Any, Port)
        ServerThread = New Thread(AddressOf ConnectionListener)
        ServerThread.IsBackground = True
        ServerThread.Start()
        TcpOpen = True
    End Sub

    Private Sub ConnectionListener()
        Server.Start()
        While True
            Dim client As TcpClient = Server.AcceptTcpClient()
            Dim T As New Thread(AddressOf StartTcpClient)
            T.IsBackground = True
            T.Start(client)
        End While
    End Sub
#End Region

修改 我在代码中做了一些更改,现在看起来像我需要的那样工作。

Public Sub StopServer()
    TcpOpen = False
    Server.Stop()
    ServerThread = Nothing
End Sub
Private Sub ConnectionListener()
    Server.Start()
    While True
        If TcpOpen Then
            If Server.Pending Then
                Dim client As TcpClient = Server.AcceptTcpClient()
                Dim T As New Thread(AddressOf StartTcpClient)
                T.IsBackground = True
                T.Start(client)
            Else
                System.Threading.Thread.Sleep(10)
            End If
        Else
            Exit While
        End If
    End While
End Sub

1 个答案:

答案 0 :(得分:0)

  1. 应该从客户端(而不是服务器)关闭连接。

  2. 客户端应向服务器发送应用程序消息以停止处理。

  3. 服务器应停止处理

  4. 服务器应执行BeginDisconnect

  5. 服务器应向客户端发送响应,指示可以关闭连接

  6. 客户端应该关闭连接。

  7. 发生BeingDisconnect时服务器应该关闭/配置监听器。