La manipulation délai de blocage .NET socket

Un TcpClient exemple, créé avec l'Accepter méthode, est utilisé pour gérer un client de connexion. Le problème survient lorsque j'en ai besoin pour terminer le thread du serveur, car il est bloqué sur un appel de réception.

Donc j'ai installé une le TcpClient ReceiveTimeout afin de boucle tous les n millisecondes pour tester la sortie de la condition. Le résultat est que l'opération de réception de lever une exception (exception socketexception), ayant le code de l'erreur SocketError.TimedOut. Bon je pensais...

Le problème est que la propriété Socket.Connecté retourne false, mais comme indiqué dans la documentation MSDN:

La valeur de la propriété Connected reflète l'état de la connexion la plus récente opération. Si vous avez besoin de déterminer l'état actuel de la connexion, effectuer un non bloquantes, de zéro octet Envoyer l'appel. Si les retours d'appel avec succès ou jette un WAEWOULDBLOCK code d'erreur (10035), puis le socket est toujours connecté, sinon, le support n'est plus connecté.

Donc, je fais ce que les états:

try {
     //Receive operation on socket stream
     //Send operation on socket stream
} catch (SocketException e) {
    if (e.SocketErrorCode == SocketError.TimedOut) {
    try {
        IAsyncResult asyncResult;
        int sResult;

        asyncResult = mSocket.Client.BeginSend(new byte[] {}, 0, 0, SocketFlags.None, delegate(IAsyncResult result) { }, null);
        sResult = mSocket.Client.EndSend(asyncResult);
        Debug.Assert(asyncResult.IsCompleted == true);

        if (mSocket.Connected == false)
            throw new Exception("not more connected");  //Always thrown
    } catch (Exception e) {
             //...
        }
}

Mais, même si le aynch Envoyer opération est exécutée, la propriété mSocket.Connecté est toujours faux, provoquant la boucle externe de résilier (les autres threads appels de méthode de Déconnexion pour mettre fin à la thread du serveur).

Ce qui me manque?

OriginalL'auteur Luca | 2010-08-26