IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

W5500 Ethernet : quelle utilité de vérifier socketStatus() == CLOSED ?


Sujet :

Arduino

  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 985
    Par défaut W5500 Ethernet : quelle utilité de vérifier socketStatus() == CLOSED ?
    Bonjour,

    Lorsqu'on utilise le shield Ethernet W5500, j'ai déjà remarqué que la fonction client.stop() est très lente.

    En cause : un timeout qui va jusque au bout, car Ethernet.socketStatus(sockindex) == SnSR::CLOSED ne se produit pas ou alors trop tard

    J'ai donc supprimé cette partie en la mettant en commentaire, voyez le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void RLucasS_EthernetClient::stop() {
    	if (sockindex >= MAX_SOCK_NUM) return;
    	// attempt to close the connection gracefully (send a FIN to other side)
    	Ethernet.socketDisconnect(sockindex);
     
    	// Waiting for the connection to close is useless and VERY SLOW !
    	/*
    	// wait up to a second for the connection to close
    	unsigned long start = millis();
    	do {
    		if (Ethernet.socketStatus(sockindex) == SnSR::CLOSED) {
    			sockindex = MAX_SOCK_NUM;
    			return; // exit the loop
    		}
    		delay(1); 
    	} while (millis() - start < _timeout); 
    	*/
     
    	delay(1); 
     
    	// if it hasn't closed, close it forcefully
    	Ethernet.socketClose(sockindex);
    	sockindex = MAX_SOCK_NUM;
    }
    Ca fonctionne très bien et de façon ultra rapide !

    J'ai plusieurs cartes Arduino qui communiquent entre elles avec ce shield Ethernet, et aussi à des clients de type ordinateur et à des server web.

    Aucun bug avec ma version de client.stop().

    Des logiciels faits en VB.NET qui émulent un client ou un server sur mon PC ne bronchent pas non plus (aucune exception, alors que les HTTP listener de VB.NET que j'utilise sont très pointilleux)

    Même le sévère W3C validator ne trouve rien à redire face à ce comportement de mon server Arduino.

    D'ou ma question :

    - à quoi ça sert d'attendre que Ethernet.socketStatus() soit égal à CLOSED ?

    - à quoi sert Ethernet.socketDisconnect() ?

    Je précise que dans les headers HTTP que j'envoie, j'indique bien "Connection: close"

    4 hypothèses :
    - le socket "de l'autre coté" ne tiens pas compte de la commande "FIN"
    - la fermeture propre du socket est très lente
    - la bibliothèque Ethernet est mal écrite vis à vis des caractéristiques de la puce W5500
    - la puce W5500 a un défaut interne et c'est elle qui ne ferme pas ses sockets

    A bientôt

  2. #2
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 985
    Par défaut
    Bonjour,

    j'ai trouvé l'auteur de la bibliothèque sur Github et j'ai posé la questions sous forme d'issue

    https://github.com/PaulStoffregen/Ethernet/issues/53

    A bientôt

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 909
    Par défaut
    Salut,

    Espérons qu'il va répondre...

  4. #4
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 985
    Par défaut
    Bonjour,

    Wireshark semble dire que les instructions "FIN" sont bien envoyées et reçues des deux côtés

    Nom : Wireshark.jpg
Affichages : 139
Taille : 129,8 Ko

    Ce relevé a été fait avec ma version de la fonction socket.close(), donc le problème vient soit de la puce W5500 soit de la bibliothèque

    A bientôt

Discussions similaires

  1. les interfaces; quelle utilité?
    Par noubigh dans le forum C#
    Réponses: 9
    Dernier message: 30/07/2008, 09h18
  2. (1 and [a] or [b])[0], quelle utilité ? Y'en a sûrement une..
    Par N.tox dans le forum Général Python
    Réponses: 22
    Dernier message: 17/06/2008, 12h51
  3. (adodbconnection) quelles utilité?
    Par doogybreton dans le forum VBA Access
    Réponses: 5
    Dernier message: 20/01/2008, 12h24
  4. Quelle technologie pour vérifier l'âge des utilisateurs ?
    Par wikers dans le forum Général Conception Web
    Réponses: 7
    Dernier message: 08/11/2006, 14h13
  5. [DataWareHouse] Quelle utilité des clés de substitution ?
    Par alpachico dans le forum Alimentation
    Réponses: 3
    Dernier message: 23/03/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo