2015-04-29 4 views
3

У меня есть 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 

ответ

0
  1. Соединение должно быть закрыто от клиента (не сервера).

  2. Клиент должен отправить сообщение приложения на сервер, чтобы прекратить обработку.

  3. Сервер должен прекратить обработку

  4. Сервер должен выполнить BeginDisconnect

  5. сервер должен отправить ответ на клиент, указывающий, что соединение может быть закрыто

  6. клиент должен закройте соединение.

  7. Сервер, когда происходит соединение Бытие, должен закрыть/Dispose Listener.

+0

Когда вы говорите «Клиент», вы имеете в виду удаленную сторону? Как остановить TcpListener, если нет соединений? –

+0

Да. У вас есть Клиент (мастер) и Сервер (ведомый). Серверы должны выполнять действия только при выполнении команды Клиентом. – jdweng

+0

Да, но проблема в том, что метод AcceptTcpClient является блокирующим вызовом, и в этом состоянии я не могу остановить сервер. Теперь я пытаюсь использовать метод BeginAcceptTcpClient, но работает только с первым подключением. Я думаю, что мне нужно создать пул потоков, но я исследую, как это сделать. Все это немного сбивает меня с толку. Я сейчас читаю это http://www.vbforums.com/showthread.php?580670-RESOLVED-Closing-a-TcpListener-without-getting-WSACancelBlockingCall-exception –

Смежные вопросы