Comment vérifier si TcpClient Connexion est fermée?
Je suis en train de jouer autour avec le TcpClient et j'essaie de comprendre comment faire de la propriété Connected dire faux lorsqu'une connexion est interrompue.
J'ai essayé de faire
NetworkStream ns = client.GetStream();
ns.Write(new byte[1], 0, 0);
Mais elle ne sera pas me montrer si le TcpClient est déconnecté. Comment voulez-vous aller à ce sujet à l'aide d'un TcpClient?
Vous devez vous connecter pour publier un commentaire.
Je ne vous recommande pas d'essayer d'écrire juste pour le test de la prise. Et de ne pas le relais .NET est Connecté propriété.
Si vous voulez savoir si l'extrémité distante est toujours actif, vous pouvez utiliser TcpConnectionInformation:
Voir Aussi:
TcpConnectionInformation sur MSDN
IPGlobalProperties sur MSDN
Description de TcpState états
Netstat sur Wikipédia
Et ici, c'est aussi une méthode d'extension sur TcpClient.
FirstOrDefault
au lieu deSingleOrDefault
The method or operation is not implemented. at System.Net.NetworkInformation.UnixIPGlobalProperties.GetActiveTcpConnections()
ou est-ce juste moi?Autant que je sais que/rappelez-vous il n'y a aucun moyen de tester si un socket est connecté autres que la lecture ou l'écriture pour elle.
Je n'ai pas utilisé le TcpClient à tous, mais la classe Socket sera de retour 0 à partir d'un appel à Lire si la télécommande a été l'arrêt en douceur.
Si l'extrémité distante ne s'arrête pas normalement [je pense] vous obtenez un délai d'attente d'exception, ne peut pas se rappeler le type désolé.
À l'aide de code comme "
if(socket.Connected) { socket.Write(...) }
crée une condition de course. Vous êtes mieux de simplement appeler socket.Rédiger et gérer les exceptions et/ou déconnexions.J'ai créé cette fonction et de travail pour moi de vérifier si le client est toujours connecté à un serveur.
La solution de Pierre Wone et uriel est très agréable. Mais vous avez aussi besoin de vérifier sur le point de Terminaison Distant, puisque vous pouvez avoir plusieurs connexions à votre ordinateur d'Extrémité.
@uriel réponse fonctionne très bien pour moi, mais j'avais besoin de code en C++/CLI, ce qui n'était pas tout à fait triviaux. Voici l' (à peu près équivalent) C++/CLI code, avec un peu de tests de robustesse ajouté pour faire bonne mesure.
J'espère que cela aidera quelqu'un.
Dans mon cas, j'ai été l'envoi d'une commande à un serveur (exécute dans une machine virtuelle sur le même ordinateur) et en attente de la réponse. Cependant, si le serveur est arrêté de façon inattendue pendant l'attente, je n'ai pas eu de notification. J'ai essayé les possibilités proposées par les autres affiches, mais aucun n'a fonctionné (il a toujours dit que le serveur est toujours connecté). Pour moi, la seule chose qui fonctionne est d'écrire 0 octets dans le flux:
Essayer, cela fonctionne pour moi
j'ai utilisé de la Minuterie parce que je voulais vérifier l'état de connexion à intervalle régulier
et pas dans une BOUCLE à l'Écoute de code [j'ai senti que c'était le ralentissement de l'envoi-réception de processus]