TcpClient.Connected renvoie true, mais le client n'est pas connecté. Que puis-je utiliser à la place?

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

  •  01-07-2019
  •  | 
  •  

Question

Dans VB.net, j'utilise TcpClient pour récupérer une chaîne de données. Je vérifie constamment la propriété .Connected pour vérifier si le client est connecté mais même si le client se déconnecte, cela retourne quand même la valeur true. Que puis-je utiliser comme solution de contournement?

Ceci est une version allégée de mon code actuel:

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

J'aurais pensé qu'au moins l'appel GetStream () lève une exception si le client est déconnecté mais que j'ai fermé l'autre application et que cela ne fonctionne toujours pas ...

Merci.

MODIFIER Interroger le client.Available a été suggéré mais cela ne résout pas le problème. Si le client n'est pas connecté «réellement», disponible ne renvoie que 0.

La clé, c’est que j’essaie d’autoriser la connexion à rester ouverte et de recevoir des données plusieurs fois via la même connexion socket.

Était-ce utile?

La solution

Lorsque NetworkStream.Read renvoie 0, la connexion a été fermée. Référence :

  

Si aucune donnée n'est disponible pour la lecture, la méthode NetworkStream.Read sera bloquée jusqu'à ce que les données soient disponibles. Pour éviter le blocage, vous pouvez utiliser la propriété DataAvailable pour déterminer si des données sont mises en file d'attente dans le tampon réseau entrant pour être lues. Si DataAvailable renvoie true, l'opération de lecture se terminera immédiatement. L'opération de lecture lira autant de données que possible, jusqu'à concurrence du nombre d'octets spécifié par le paramètre size. Si l'hôte distant ferme la connexion et que toutes les données disponibles ont été reçues, la méthode de lecture se termine immédiatement et renvoie 0 octet.

Autres conseils

Meilleure réponse:

  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

Vous devez configurer une minuterie qui envoie un message à l'autre socket de temps en temps.

Dim TC As New TimerCallback (AddressOf Ping)

Tick = Nouveau Threading.Timer (TC, Nothing, 0, 30000)

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

Au lieu d'interroger client.connecté, utilisez peut-être les propriétés de NetworkStream pour voir s'il n'y a plus de données disponibles?

Quoi qu'il en soit, il existe un ONDotnet.com

scroll top