Comment détecter une Prise de Déconnexion en C#

Je suis en train de travailler sur un client/serveur de relation, qui est destinée à envoyer des données en arrière et en avant pour un montant indéterminé de temps.

Le problème, je vais tenter de surmonter est sur le côté client, étant que je n'arrive pas à trouver un moyen pour détecter une déconnexion.

J'ai pris un couple de passes à d'autres peuples de solutions, allant de la juste attraper IO Exceptions, aux bureaux de la prise de courant à trois SelectModes. J'ai aussi essayé en utilisant une combinaison d'un sondage, avec un contrôle sur le "Disponible" domaine de la prise.

//Something like this
Boolean IsConnected()
{
    try
    {
        bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead);
        bool part2 = (this.Connection.Client.Available == 0);

        if (part1 & part2)
        {
            //Never Occurs
            //connection is closed
            return false;
        }
        return true;
    }
    catch( IOException e )
    {
        //Never Occurs Either
    }
}

Sur le côté serveur, une tentative d'écriture d'un "vide" de caractère ( \0 ) pour le client forces ar Exception et que le serveur peut détecter que le client s'est déconnecté ( assez facile de concert ).

Sur le côté client, la même opération donne aucune exception.

//Something like this
Boolean IsConnected( )
{
    try
    {

        this.WriteHandle.WriteLine("
//Something like this
Boolean IsConnected( )
{
try
{
this.WriteHandle.WriteLine("\0");
this.WriteHandle.Flush();
return true;
}
catch( IOException e )
{
//Never occurs
this.OnClosed("Yo socket sux");
return false;
}
}
"
); this.WriteHandle.Flush(); return true; } catch( IOException e ) { //Never occurs this.OnClosed("Yo socket sux"); return false; } }

Un problème que je crois que je vais avoir dans la détection d'une déconnexion par un sondage, c'est que je peux assez facilement à la rencontre d'une faux sur un SelectRead, si mon serveur n'a pas encore écrit quelque chose de nouveau pour le client depuis la dernière case... ne sais Pas quoi faire, j'ai chassé en bas de chaque option pour faire de la détection que je peux trouver, et rien n'a été de 100% pour moi, et, finalement, mon but ici est de détecter un serveur (ou connexion) échec, d'en informer le client, attendre pour vous reconnecter, etc. Donc, je suis sûr que vous pouvez imaginer que c'est une partie intégrante de la pièce.

Apprécie quelqu'un de suggestions.
Merci à l'avance.

EDIT: Personne visualisation de cette question devrait prendre note de la réponse ci-dessous, et mon dernier commentaire. J'ai élaboré sur comment j'ai surmonté ce problème, mais n'ont pas encore fait un Q&Un style post.

Il suffit de prendre IOExceptions, et d'utiliser un délai d'attente. Vous n'avez pas besoin de toutes ces autres balivernes.
J'ai essayé déjà ( au cas où vous n'avez pas vraiment lu mon post... ) et il est frappé ou manquer. Une opération de lecture d'expirer après une seconde provoque une IO, ce qui pourrait forcer une déconnexion... Mais si je n'en ai pas reçu de données...?
J'ai lu votre post. Il n'est pas "hit and miss", il est soumis à des données asynchrone de mise en mémoire tampon à la fois localement et à distance. Vous n'obtiendrez pas une exception lors de la première écriture d'un échec de la connexion, qu'elle n'a pas encore été détectés: vous l'obtiendrez à la suite d'écrire, après que le protocole TCP a dépassé le nombre de tentatives.
Désolé de le dire, je suis en total désaccord. Je peux Fraps une session de Débogage si vous le voulez bien...
Socket.Recevoir et EndReceive() renvoie zéro lorsque la distance a fait un arrêt sur le côté. Ceci est documenté dans la description de l'API: Si vous utilisez une connexion de Socket, la méthode de réception sera lu comme la quantité de données est disponible jusqu'à la taille de la mémoire tampon. Si l'hôte distant s'arrête la connexion de Socket de la méthode d'Arrêt, et l'ensemble des données disponibles a été reçu, la méthode de réception seront exécutés immédiatement et retour à zéro octets.

OriginalL'auteur DigitalJedi805 | 2012-08-06