У меня есть TCP-сервер, который работает нормально, но теперь мне нужно остановить его и все потоки безопасным способом. Насколько я исследую Прервать метод не нормаленКак вежливо остановить TcpListener?
Я отлажена и, когда сервер запускается и не имеет никаких связей, похоже, код останавливается на линии
Server = New TcpListener(IPAddress.Any, Port)
Так что, когда я называю StopServer I получить сообщение об ошибке 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
Edit: я внести некоторые изменения в коде, и теперь, кажется, работает, как мне нужно.
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
Когда вы говорите «Клиент», вы имеете в виду удаленную сторону? Как остановить TcpListener, если нет соединений? –
Да. У вас есть Клиент (мастер) и Сервер (ведомый). Серверы должны выполнять действия только при выполнении команды Клиентом. – jdweng
Да, но проблема в том, что метод AcceptTcpClient является блокирующим вызовом, и в этом состоянии я не могу остановить сервер. Теперь я пытаюсь использовать метод BeginAcceptTcpClient, но работает только с первым подключением. Я думаю, что мне нужно создать пул потоков, но я исследую, как это сделать. Все это немного сбивает меня с толку. Я сейчас читаю это http://www.vbforums.com/showthread.php?580670-RESOLVED-Closing-a-TcpListener-without-getting-WSACancelBlockingCall-exception –