TcpClient.Connected gibt true zurück, doch Client nicht angeschlossen ist, was kann ich stattdessen verwenden?

StackOverflow https://stackoverflow.com/questions/101708

  •  01-07-2019
  •  | 
  •  

Frage

In VB.net Ich bin mit dem TcpClient eine Reihe von Daten abzurufen. Ich überprüfe ständig die .Connected Eigenschaft, um zu überprüfen, ob der Client verbunden ist, sondern auch wenn der Client trennt diese nach wie vor gibt true zurück. Was kann ich als Abhilfe für dieses verwenden?

Dies ist eine abgespeckte Version meines aktuellen Code:

Dim client as TcpClient = Nothing
client = listener.AcceptTcpClient
do while client.connected = true
   dim stream as networkStream = client.GetStream()
   dim bytes(1024) as byte
   dim numCharRead as integer = stream.Read(bytes,0,bytes.length)
   dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i)
loop

Ich hätte zumindest dachte der GetStream () -Aufruf eine Ausnahme auslösen würde, wenn die Client-Verbindung beendet wurde, aber ich habe die andere App geschlossen und es funktioniert immer noch nicht ...

Danke.

Bearbeiten Polling die Client.Available wurde vorgeschlagen, aber das bedeutet nicht, das Problem zu lösen. Wenn der Client ‚acutally‘ nicht angeschlossen ist verfügbar nur 0 zurück.

Der Schlüssel ist, dass ich versuche, die Verbindung zu erlauben, offen zu bleiben und ich erlaube, Daten mehrfach über die gleiche Socket-Verbindung zu erhalten.

War es hilfreich?

Lösung

Wenn NetworkStream.Read 0 zurückgibt, dann wird die Verbindung geschlossen wurde. Referenz :

  

Wenn keine Daten zum Lesen verfügbar ist, wird die NetworkStream.Read Methode blockiert, bis Daten verfügbar sind. Um zu vermeiden, blockiert, können Sie die DataAvailable Eigenschaft verwenden, um festzustellen, ob Daten in dem eingehenden Netzwerkpuffer Warteschlange wird zum Lesen. Wenn DataAvailable true zurückgibt, wird der Lesevorgang sofort ab. Der Lesevorgang wird so viel gelesenen Daten als verfügbar ist, bis zu der Anzahl von Bytes, die von der Größe Parameter angegeben. Wenn die Remote-Host die Verbindung heruntergefahren, und alle verfügbaren Daten empfangen wurden, wird abgeschlossen die Read-Methode sofort und Rück Null-Bytes.

Andere Tipps

Bessere Antwort:

  if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];
                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }

https://i.stack.imgur.com/Jb0X2.png

LINK = https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0

Sie benötigen einen Timer einrichten, die eine msg an die andere Buchse von Zeit zu Zeit sendet.

Dim TC A New Timercallback (AddressOf Ping)

Tick = New Threading.Timer (TC, Nichts, 0, 30000)

Sub Ping()
    Send("Stil here?")
End Sub

Statt Polling client.connected, vielleicht von den Eigenschaften des Network verwenden, um zu sehen, ob es keine Daten mehr vorhanden ist?

Wie auch immer, es gibt eine ONDotnet.com Artikel mit TONNEN Informationen über Hörer und so weiter. Sollte Ihnen helfen, Ihre Vergangenheit Problem bekommen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top