begin process at 2012 02 15 19:49:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Réseaux & Internet

 > 

Sockets

 > 

Timeout TCP sur les sockets


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Timeout TCP sur les sockets

lundi 19 mars 2007 à 15:13:51 | Timeout TCP sur les sockets

shackleton1986

Je suis en train de faire des tests sur les sockets TCP dans le framework 2.0 et j'ai remarqué quelque chose d'assez curieux...
Je voulais savoir à quel niveau sont renvoyés les exceptions typiquement lorsqu'un cable réseau est arraché ou autre. Pour tester, j'utilise un client telnet sur un PC pour ouvrir un socket avec mon serveur dont le code est ci-dessous. Tout de suite après je déconnecte le PC client du réseau (j'enlève le cable à la barbare ^^), puis je fais des sleep pendant un certain temps voir si j'ai une exception qui est remontée par le framework.
Jusque là, pas d'exception alors que la pile TCP a du se vautrer en raison de l'absence du client qui a été déconnecté sauvagement :) Là je me dis c'est normal, j'aurais une exception la prochaine fois que je veu utiliser mon socket. Du coup je tente de faire un send ... et bingo !!! Aucune exception et le retour du send me dit qu'il a bien envoyé ces octets :s J'essaye même de regarder la valeur "connected" du socket pour voir si j'ai bien quelqu'un en face et il me dit que oui ... :(
Bref, voila mon problème : comment savoir si j'ai toujours quelqu'un en face avec le .net framework ? Et surtout comment savoir quand il me dit que mes données ont bien été envoyées (retour du send) alors que c'est pas le cas ??

Par la suite j'ai essayé d'utiliser la variable SendTimeout du socket mais ca n'a rien changé ...

Voici le code tout bête de mon serveur TCP pour que vous voyez exactement ce que je fais :

Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Form1
    Dim port As Integer = 10000

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sckListening As Socket
        Dim sckClient As Socket

        sckListening = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        sckListening.Bind(New IPEndPoint(IPAddress.Any, port))
        sckListening.Listen(5)
        System.Console.WriteLine("Socket en écoute sur " & sckListening.LocalEndPoint.ToString)
        sckClient = sckListening.Accept()
        System.Console.WriteLine("Serveur: Connexion acceptée avec " & sckClient.RemoteEndPoint.ToString)

       'On règle le sois-disant timeout TCP pour l'envoi
        sckClient.SendTimeout = 1000

       'Là en gros on dort pendant 50 sec pendant qu'on arrache (gentiment) le cable du client
       'A chaque sleep on affiche la variable Connected du socket pour voir s'il ya toujours
       'quelqu'un en face

        Dim i As Integer
        For i = 0 To 9
            System.Console.WriteLine("Attente de plantage ... " & CStr((i + 1) * 5) & "sec")
            System.Console.WriteLine("Socket connecté ? " & sckClient.Connected.ToString)
            Threading.Thread.Sleep(5000)
        Next

       'Maintenant on envoi 6 octets sur le socket qui est mort pour voir si on récupère une
       'exception

        Dim nbByte As Integer
        nbByte = sckClient.Send(Encoding.ASCII.GetBytes("bijour"), 6, SocketFlags.None)
        System.Console.WriteLine(CStr(nbByte))
   
       'On a eut aucune exception et la fonction send a envoyer son retour immédiatement
       'Mais on fait des sleeps en se disant que le SendTimeout va peut être nous générer
       'une exception plus tard

        For i = 0 To 9
            System.Console.WriteLine("Attente de plantage ... " & CStr((i + 1) * 5) & "sec")
            System.Console.WriteLine("Socket connecté ? " & sckClient.Connected.ToString)
            Threading.Thread.Sleep(5000)
        Next

       'Et voilà c'est fini, et on a envoyé des données comme si de rien n'était à un client inexistant
        System.Console.WriteLine("Fin")
    End Sub
End Class


Merci d'avances pour vos réponses :)
mardi 20 mars 2007 à 00:26:58 | Re : Timeout TCP sur les sockets

Egyde

Réponse acceptée !
Intéressant tout ça... J'ai jamais rencontré ce pb (vu que je programme que sous VB6 pour le moment). Cela dit, j'ai trouvé quelques infos qui pourront t'aider certainement. Apparemment, c'est un bug connu chez KroKro :
[ Lien ]

@+
mardi 20 mars 2007 à 08:54:49 | Re : Timeout TCP sur les sockets

shackleton1986

Merci beaucoup pour ta réponse, c'est quand même hallucinant ces bugs ...
Je vais essayer de voir comment je peu me débrouiller avec .NET ^^
Je trouve ca dingue que des bugs si importants restent sans correctif --> merci Crosoft :p

En tout cas si quelqu'un a une bidouille pour repérer les déco intempestives de socket je suis preneur !!!


mercredi 21 mars 2007 à 09:10:40 | Re : Timeout TCP sur les sockets

shackleton1986

J'ai posée ma question sur les newsgroups US de Microsoft et j'ai obtenu la réponse suivante :

It can take time to acknowledge that the socket connection is really broken.
It's not instant measure.

From the VS2005 documentation:
"
A successful completion of the Send method means that the underlying system
has had room to buffer your data for a network send.
..
..
..
The successful completion of a send does not indicate that the data was
successfully delivered.
"

I use this on our apps to check quite reliably that the socket is open on
both ends or not:

        private static bool IsSocketReallyConnected(Socket socket)
        {
            bool retState = false;
            bool blockingState = socket.Blocking;
            try
            {
                byte[] tmp = new byte[1];

                socket.Blocking = false;
                socket.Send(tmp, 0, 0);
                retState = true;
            }
            catch (SocketException e)
            {
                // 10035 == WSAEWOULDBLOCK -> Buffer full for now
                if (e.NativeErrorCode.Equals(10035))
                {
                    retState = true;
                }
            }
            finally
            {
                socket.Blocking = blockingState;
            }

            return retState;
        }

And it's not a bug

Apparement ce n'est pas un bug mais plutôt une "feature" comme dirait un ami à moi ^^ J'ai pas encore testé ce bout de code mais je trouve ca complètement naze que le send soit pas bloquant et qu'on soit obligé de s'écrire une fonction de 20 lignes sortie de derrière les bois pour savoir si son socket est ouvert ...
mercredi 21 mars 2007 à 12:55:04 | Re : Timeout TCP sur les sockets

Egyde

Que Send n'indique pas la réception correcte des données passe encore. En y réfléchissant bien, ça accélère le trafic dans le sens où on attend pas de confirmation de la part du poste distant.

Mais par curiosité, comme ce n'est visiblement pas l'état courant du socket, j'aimerais bien savoir ce que retourne exactement sckClient.Connected...
mercredi 21 mars 2007 à 14:01:09 | Re : Timeout TCP sur les sockets

shackleton1986

Je suis d'accord avec toi, on peut encore accepter que send indique juste que les données on bien été mises dans le tampon. Mais je me demande alors a quoi sert la variable sckClient.Blocking qui par défaut est à True ?? Parcqu'à priori ca ne change rienà première vue. En ce qui concerne le sckClient.connected je ne comprend toujours pas son utilité...

Je me suis un peu penché sur sur la pile TCP windows et il apparait que par défaut, ce n'est qu'au bout de 2 heures (KeepAliveTime) que des "retransmissions" sont effectuées pour tester la présence du tiers distant. Du coup jusqu'à ce timeout la connexion TCP est considéré active par la pile TCP et donc par le Framework. On peut donc simplement s'en aperçevoir quand le tampon est plein et que l'on obtient une exception. Enfin, c'est ce que je pense mais il faut encore que je fasse quelques tests

Je vous tiendrai au courant de mes investigations






Cette discussion est classée dans : system, console, socket, tcp, writeline


Répondre à ce message

Sujets en rapport avec ce message

system.console.writeLine [ par ladry ] qqn sait-il s'il existe l'équivalent de system.console.writeLine ("Le texte a afficher dans la ligne de commande") en VB 6.0 car cette fonction est un enregistrer plusieurs textbox dans un meme fichier [ par zazsze ] J'ai créé 5 textbox dans lequel j'écris du texte. J'enregistrer ensuite ces données dans un seul fichier texte (Pierre.text) en cliquant sur mon bouto Programmation socket en mode console [ par funny2000 ] j'aimerai bien avoir de l'aide pour concevoir une application en mode console qui utilise les socket en mode console !merci de vouloir m'aider raw socket et protocole TCP/IP [ par robertmouac ] Bonjour tout le monde. Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (ve raw socket et protocole TCP/IP [ par robertmouac ] Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (verif avec ethreal). Le pr Erreur bloquante sur mini application client tcp/ip [ par Billybobbonnet ] Salut à tous,Je fais une mini application dont le but est d'envoyer à une ip donnée, sur un port, un message. Tous ces paramètres sont lancés en argum Erreur bloquante sur mini application client tcp/ip [ par Billybobbonnet ] Salut à tous,Je fais une mini application dont le but est d'envoyer à une ip donnée, sur un port, un message. Tous ces paramètres sont lancés en argum Morpion en socket [ par wm198876 ] Bonjour,    Je suis actuellement en BTS d'informatique de gestion et j'ai un morpion à programmer en socket en VB gràce à Visual Basic 2005.Je suis lo wmi xp sp2 [ par jeffrey17 ] Bonjour, j'aurai bien aimé avoir une réponse claire nette et précise s'il vous plait concernant la connexion wmi sur un ordinateur distant (XP SP2).Au contourné dépassement de capacité [ par mathben ] Bonjour, j'ai fait un beau programme, je demande a mon ami de trouver tous les bogues, il écrit le nombre 99999999999999999999999999999999999999999999


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,022 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales