TcpClient.Connected restituisce true ma il client non è connesso, cosa posso usare invece?

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

  •  01-07-2019
  •  | 
  •  

Domanda

In VB.net sto usando TcpClient per recuperare una stringa di dati. Controllo costantemente la proprietà .Connected per verificare se il client è connesso ma anche se il client si disconnette, ciò ritorna comunque vero. Cosa posso usare come soluzione alternativa per questo?

Questa è una versione ridotta del mio codice attuale:

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

Avrei immaginato che almeno la chiamata GetStream () avrebbe generato un'eccezione se il client fosse disconnesso ma ho chiuso l'altra app e ancora non ...

Grazie.

Modifica Polling the Client. Disponibile è stato suggerito ma questo non risolve il problema. Se il client non è "connesso" in modo attivo, restituisce solo 0.

La chiave è che sto cercando di consentire alla connessione di rimanere aperta e di consentirmi di ricevere dati più volte sulla stessa connessione socket.

È stato utile?

Soluzione

Quando NetworkStream.Read restituisce 0, la connessione è stata chiusa. Riferimento :

  

Se non sono disponibili dati per la lettura, il metodo NetworkStream.Read si bloccherà fino a quando i dati non saranno disponibili. Per evitare il blocco, è possibile utilizzare la proprietà DataAvailable per determinare se i dati sono accodati nel buffer di rete in entrata per la lettura. Se DataAvailable restituisce true, l'operazione di lettura verrà completata immediatamente. L'operazione di lettura leggerà tutti i dati disponibili, fino al numero di byte specificato dal parametro size. Se l'host remoto interrompe la connessione e tutti i dati disponibili sono stati ricevuti, il metodo Read verrà completato immediatamente e restituirà zero byte.

Altri suggerimenti

Migliore risposta:

  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

È necessario impostare un timer che invia di tanto in tanto un messaggio all'altro socket.

Dim TC come nuovo TimerCallback (AddressOf Ping)

Spuntare = New Threading.Timer (TC, Nothing, 0, 30000)

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

Invece di eseguire il polling client.connected, forse utilizzare le proprietà di NetworkStream per vedere se non ci sono più dati disponibili?

Comunque, c'è un ONDotnet.com articolo con tonnellate di informazioni su ascoltatori e quant'altro. Dovrebbe aiutarti a superare il tuo problema ...

scroll top