vb.net - 如何礼貌地停止 TcpListener?

标签 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. 应从客户端(而不是服务器)关闭连接。

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

  3. 服务器应停止处理

  4. 服务器应执行 BeginDisconnect

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

  6. 客户端应关闭连接。

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

关于vb.net - 如何礼貌地停止 TcpListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29946469/

相关文章:

sql - 如何将参数传递给 sqldataadapter?

vb.net - 应用程序安全 : Counting days independent of system calendar

vb.net - 您可以忽略 Resharper 中特定的冗余限定符吗?

vb.net 检查两个面板是否重叠

multithreading - 如何在 Windows 服务中使用 Threadpool.QueueUserWorkItem?

java - 让 1 个线程等待一组线程完成

tcp - 将 C++ 服务器移植到云端

java - SwingWorker 线程中的多线程

c# - 表明已通过网络接收到所有数据的最佳方式?

C# 监听 TCP 端口