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

Shell et commandes GNU Discussion :

Port en écoute et détection erreur réseau


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut Port en écoute et détection erreur réseau
    Bonjour,

    Je dois faire un petit programme qui se met en ecoute sur un port distant via le réseau et récupérer les informations qui viennent au fur et a mesure et idéalement l'integre dans un BDD type mysql ou bien autre solution moins bien, le met dans un fichier

    Je suis sous Linux et en plus j'aimerai pouvoir faire une detection de perte du distant.

    J'ai essayé de retranscrire en commande bash ce que je souhaitais faire. Le fichier exe_netcat.sh serait appelé toutes les 5 min par le cron.
    vérifie le ping:
    si ok = lancement du script netcat.sh, si deja lancé rien faire
    si nok = arrêt de tous les scripts puis attendre la prochaine execution du cron

    netcat.sh
    connexion au serveur distant en telnet et récuperation des donnes dans un fichier


    exe_netcat.sh
    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
     
    #!/etc/bash
     
    IP='192.168.255.11'
    if ping -c1 -w3 $IP 2>/dev/null 2>&1
    then
    echo 'Host found" >&2
    var= netcat.sh
    if [$(pgrep -f $var)>1]
    then
    echo 'process en cours'
    else
    bash netcat.sh
    fi
    else
    echo 'Host not found' >&2
    pkill -f exe_netcat.sh
    pkill -f netcat.sh
    fi
    netcat.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/bash
    while true
    do
    echo en attente
    telnet 192.168.255.11 3299 > test.out
    echo $(date)
    done

    Ma 1ere question est: avez vous une autre solution pour faire ca?
    Si non j'ai un problème pour la detection du process et son kill je ne vois pas ou mon script ne colle pas
    Est il possible d'envoyer directement vers une BDD mysql sans passer par le telnet ?

    merci d'avance

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Avant de répondre à tes questions, quelques remarques sur ton code :

    • Le shebang doit être sur la première ligne
    • var= netcat.sh
      Il ne faut pas d'espace après le "=".
      Cette ligne ne fait qu'exécuter le script netcat.sh.
    • if [$(pgrep -f $var)>1]
      Les crochets n'ont pas valeur de parenthèses. C'est un raccourci pour la commande test. Donc il faut des espaces à l'intérieur des crochets.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if [ $(pgrep -f $var) -gt 1 ]
    • Comme tu l'as remarqué, le test a été changé, aussi, car tu veux une comparaison numérique, et non alphabétique. N'est-ce pas ?
    • bash netcat.sh
      Il faut perdre cette habitude de faire croire que c'est sh quand c'est bash, l'interpréteur.
      La compatibilité n'est pas assurée.
      Donc c'est "netcat.bash et pas ".sh".
      De plus, pourquoi ne pas laisser le script choisir son interpréteur (sans "bash" devant) ? Le shebang serait-il mal fixé ?
    • while true
      Horreur. Tu dois réfléchir à une condition d'arrêt.


    Ma 1ere question est: avez vous une autre solution pour faire ca?
    Euh... pourquoi séparer en 2 scripts ?

    Si non j'ai un problème pour la detection du process et son kill je ne vois pas ou mon script ne colle pas
    Si tu avais réfléchi à la condition d'arrêt tu n'aurais pas à faire appel à des arrêts barbares.
    Un kill est superflu.

    Est il possible d'envoyer directement vers une BDD mysql sans passer par le telnet ?
    Peut-être. Le retour de telnet est toujours au même format ? As-tu un exemplaire ? (anonymisé si possible)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Je rajouterais quelques autres remarques sur le script exe_netcat.sh :

    • Il y a un problème de quotes ici : echo 'Host found" >&2 (simple quote ouvrante et double quote fermante ça peut pas marcher, d'ailleurs ça se voit directement avec la coloration syntaxique du forum).
    • De manière général il y a un problème de normalisation sur les echo : un coup des doubles quotes, un coup des simples quotes, un coup y-a rien du tout : je recommande les doubles quotes personnellement ça permet de faire des choses plus simples pour injecter des variables dans ses expressions (echo "var1=${var1} and var2=${var2}" par exemple).
    • Es-tu sur de ce shebang ? #!/etc/bash ... en général sous Linux bash est plutôt dans /bin (après on sait jamais avec certains OS mais je préfère prévenir au cas ou, ça me parrait suspect).


    Et sur le script netcat.sh :

    • echo $(date) : le echo ne sert à rien ici autant écrire directement date tu aura le même résultat


    Citation Envoyé par Flodelarab
    Il faut perdre cette habitude de faire croire que c'est sh quand c'est bash, l'interpréteur.
    La compatibilité n'est pas assurée.
    Donc c'est "netcat.bash et pas ".sh".
    Je plaide coupable :p

    Perso tout mes shells scripts sont en .sh ou sans extensions carrément, je ne me fie qu'au shebang pour savoir quel interpréteur/langage est utilisé (ça peux même m'arriver que des fichiers sans extensions soient en Python ou Ruby, bon quand même pas en .sh dans ce cas la).

    Je pense que c'est tellement répendu comme usage qu'on en arrivera jamais à bout, donc pour l'instant je ne pense pas m'y mettre à faire des extensions .bash :

    • Absolument tout les codeurs de scripts avec lesquels j'ai bossé jusqu'à maintenant entre autres et y-en a un paquet utilisent cette extension en faisant du bash
    • Même chose dans pléthore de cours universitaires comme en ligne, même dans l'ABS guide les exemples sont en .sh (pas la peine d'être plus royaliste que les rois comme on dit)
    • Sans compter les scripts tout faits de certaines grosses solutions d'enterprises et de système d'infos comme Apache Kafka par exemple : head -1 kafka_2.11-0.10.0.0/bin/*.sh | grep -c bash => 21


    Personnellement j'ai laissé tombé il y a bien longtemps cette nécéssité d'être sh/POSIX compliant pour les vieux systèmes Unix. Déjà parce que le sh POSIX est ultra limité comparé à ce qu'on peut faire aujourd'hui en bash d'une part, et parce que le ROI de rester compatible est extrèmement faible d'autre part : en mettant de côté que Linux est largement majoritaire aujourd'hui, mêmes les quelques distributions Unix d'actualité ont la possibilité d'avoir bash dans des versions récentes.

    Par contre je pense qu'il faut laisser dans tout les cas au moins un shebang pour indiquer l'interpréteur à celui qui relis le script.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Florent42 Voir le message
    exe_netcat.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ping -c1 -w3 $IP 2>/dev/null 2>&1
    En plus des réponses déjà fournies et que j'approuve, il reste quelques trucs bizarres...

    Tu rediriges la stderr dans le vide, puis tu la rediriges vers la stdout.
    J'avoue que je ne sais pas trop ce que ça donne

    Citation Envoyé par Florent42 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var= netcat.sh
    if [$(pgrep -f $var)>1]
    En plus des réponses déjà fournies et que j'approuve, ces 2 lignes devraient être changées...

    soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var=$(netcat.sh)  # pour stocker dans la variable "$var" la sortie standard de l'exécution de "netcat.sh"
    Je ne sais trop que penser de la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [$(pgrep -f $var)>1]
    Veux-tu tester la valeur du code de retour de l'appel à pgrep ?

    auquel cas il suffirait de faire:
    De plus, ton code serait plus facile à lire s'il était bien indenté...

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,

    à moi :
    Citation Envoyé par Florent42 Voir le message
    if [$(pgrep -f $var)>1]

    C'est pas mandatory les espaces après et avant les crochets, genre if [ $(pgrep -f $var)>1 ] ?

    Citation Envoyé par Florent42 Voir le message
    while true
    On a pas eu récemment une discussion sur cette abomination et le fait qu'une boucle doit toujours pouvoir être arrêtée ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut merci
    merci pour votre aide et votre concours

    J'ai bien compris que j'avais pas mal de correction a faire et en tenant de compte des améliorations, voici ce que je pense faire:

    Si on considère 1 seul script pour tout faire dorénavant et gérer au mieux une condition d'arrêt.

    Peut on réaliser l'algorithme suivant:
    Tant que l'adresse ip repond
    alors
    l'hote est trouvé je lance le telnet

    Si l'adresse n'est pas trouvée ou ne répond plus
    attendre 5s et ressayer , puis si besoin attendre 5s et réssayer etc

    Pour la 1ere partie voici ma proposition. Par contre comment intégrer l'ensemble dans un seul et même script?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    IP='192.168.255.11'
    while ping -c1 -w3 $IP 2>/dev/null
    do
        echo "Host found"
        echo "lancement script telnet"
        telnet $IP 3299 > test.out
    done

    La pour l'instant j utilise telnet. Ce qui est pas une solution idéale mais qui peut dépanner si besoin.

    Voici le type de données a traiter:
    0LOIA 0429010900123044514044515 22RD 25505 047104 0 000000P
    V3 0 0 2 0 0S 2D D P 044537 23 29000 0 CO 0 21FA9CF
    0 0 0 0 0 0 0 0 0

    L'idée ensuite est de redécouper la chaine de caractère pour récuperer les éléments intéressant. Mais puis je mettre en ecoute le port et récupérer les flux en fur et a mesure pour les intégrer dans mysql?

    merci d'avance

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    La pour l'instant j utilise telnet. Ce qui est pas une solution idéale mais qui peut dépanner si besoin.
    C'est très bien telnet. C'est juste pas sécurisé.

    Voici le type de données a traiter:
    0LOIA 0429010900123044514044515 22RD 25505 047104 0 000000P
    V3 0 0 2 0 0S 2D D P 044537 23 29000 0 CO 0 21FA9CF
    0 0 0 0 0 0 0 0 0
    Ce fichier semble n'avoir aucun format.
    Connais-tu le format des données envoyées ?

    puis je mettre en ecoute le port
    Non ! Tu te trompes de rôle. Le client, c'est toi ! Ce sont les serveurs qui sont à l'écoute.
    Toi, tu peux faire des requêtes. Autant que tu veux tant que tu n'es pas blacklisté par le serveur qui en a marre d'être harcelé.

    récupérer les flux en fur et a mesure pour les intégrer dans mysql?
    Même question, même réponse : oui.
    En gros, tu es venu dire que tu n'as pas avancé et que tu ignores nos messages.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    ce n'est pas parce qu'un serveur répond à un ping qu'il a un service telnet actif.

    j'utiliserais plutôt netcat pour tester qu'il y a effectivement un port telnet ouvert.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    telnet me pose problème car je ne peux que passer par un fichier une intégration immédiate dans une BDD serait beaucoup plus pratique. Le problème de sécurité ne me dérange pas car c'est un réseau complètement indépendant et totalement coupé du reste. C'est simplement plus confortable d'avoir les données directement dans la BDD plutot que de faire un script en plus qui lira le fichier et integrera les données dans la BDD

    Le format reçu est simplement des trames textes ni plus ni moins et envoyées au fil de l'eau

    Je me suis mal exprimé : il faudrait que le client se connecte au port distant en permanence aucune déconnexion prévue SAUF si le ping ne repond plus


    Il ne s'agit pas vraiment d'un serveur, donc je ne m'attacherais seulement a savoir si il est en ligne ou pas, d'ou la verification du ping. Le port distant est ouvert en même temps que l'interface réseau démarre

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Reprenons les bases. Une commande renvoie une sortie sur STDOUT, des erreurs sur STDERR, et un code retour.
    Le code retour est égal à 0 si tout c'est bien passé.
    Il est égal à un nombre non nul si il y a eu une erreur.

    Il ne faut pas confondre les 3.
    Je ne vois pas pourquoi la commande telnet ne renverrait pas un message d'erreur ou un code retour comme toute les applications.

    Quelle est cette lubie de vérifier que le serveur est là?
    Cela tient du Trouble Obsessionnel Compulsif de vérifier sa présence.


    D'autre part, au début, tu parlais d'une demande toutes les 5 minutes, et maintenant, on dirait que tu veux recoder Wireshark.
    Tout ton questionnement n'est pas très clair.
    De mon point de vue : un cron, une requête, une commande mysql, et on passe à autre chose.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    je ne dis pas le contraire pour presque toutes applications cela marche comme tu expliques

    Néanmoins et c'est bien la mon problème et non un TOC, avec telnet connecté sur mon "serveur" je déconnecte le réseau un certain temps et au retour du réseau, la fenêtre semble en attente...mais en réalité bloquée!

    D'ou le fait que je veux anticiper ca par un controle extérieur, je ne peux pas me fier a la "possible" deconnexion du telnet qu il ne fait pas.

    Au départ je parlais de test de ping toutes les 5 min pour tester le ping. Après reflexion ce test est trop long car je risque de perdre trop d'information.

    En effet loin de moi l'idée de redevelopper wireshark, mais la connexion doit etre permanence sur le port. En effet le serveur donne des informations régulièrement a qui est connecté. SI personne n'est connecté, les informations sont tout simplement perdues. D'ou le fait de détecter au mieux une perte de communication (typiquement réseau) pour pouvoir la rétablir au plus tôt.

    j'ai d'ailleurs dans ce sens établit un autre script qui normalement devrait reboucler sur un test de ping avant de relancer le telnet.
    Le hic c'est que j'ai l'impression que l'arret du telnet ne se fait pas et le script reste bloqué la dessus

    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
    25
    26
     
    #!/bin/bash
     
    IP='192.168.255.11'
    testping
            {
            if ping -c1 -w3 $IP 2>/dev/null
            then
            exetelnet
                    else
                    sleep 5
            fi
            }
     
    exetelnet
            {
            while ping -c1 -w3 $IP 2>/dev/null
            do
            echo "Host found"
            echo "lancement script telnet"
            DATE=$(date +%F_%H-%M-%S)
            telnet 192.168.255.11 3299 > $DATE.out
            done
            }
     
    testping

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Néanmoins si une solution pouvait exister pour récupérer les flux autrement que par telnet, les récupérer en tant que variable pour pouvoir les injecter dans une BDD ce serait vraiment la meilleure solution
    Avez vous la possibilité de m'aiguiller?

    merci

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Ce serait pas plutôt qu'il attend une instruction ou la fin de la session telnet ? Il se passe quoi quand tu tapes Ctrl+D quand telnet attend ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    un Ctrl+D coupe la session effectivement dans une session telnet "normale"

    mais envoyer un crtl+d dans le script...?

  15. #15
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2010
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2010
    Messages : 178
    Points : 618
    Points
    618
    Par défaut
    .
    "" En effet le serveur donne des informations régulièrement a qui est connecté ""
    Ok, il faut donc établir une connexion sur ce serveur.
    C'est un socket TCP ou UDP ?

    Tu peux faire ça en Python, ça sera beaucoup plus propre et tu peux tout intégrer dans un seul script.

    Exemple de Socket UDP Client/serveur (voir la partie client):
    https://pymotw.com/3/socket/udp.html

    Dans ton cas, tu peux remplacer le try/finally par une boucle While True afin de garder la connexion ouverte et supprimer sock.sendto car tu en as pas besoin.
    Si ton serveur est instable (ne propose pas toujours de socket fonctionnel), tu peux simplement rajouter la boucle en surcouche du Try. De cette façon si une erreur arrive, il va retenter une connexion. Mais il vaut mieux dans ce cas mettre un délai d'attente avant la nouvelle tentative.

    Puis, tu peux coupler le tout sur du mysql client avec PyMySQL:
    https://www.tutorialspoint.com/pytho...ase_access.htm

    Une fusion des scripts devrait pas être trop complexe.

  16. #16
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par Florent42 Voir le message
    Je dois faire un petit programme qui (...) récupérer les informations qui viennent au fur et a mesure et idéalement l'integre dans un BDD type mysql ou (...) dans un fichier (...) et en plus j'aimerai pouvoir faire une detection de perte du distant.
    quel est le type des données qui transitent ? des lignes de texte ? un flot continu de nombres séparés par des virgules ? des fichiers entiers ? des blocs d'octets de taille fixe ? ... ?

    un outil comme socat peut permettre de faire pas mal de choses (fiabilité des données grâce à TCP, timeouts, reconnexions, envoi de fichiers ou de données brutes, exécution de commandes etc.)

    mais prenons le cas de TCP quand il y a une déconnexion, le serveur lui ne sait pas qu'il y a un problème réseau et continue d'envoyer des paquets, dont il ne reçoit pas l’acquittement par le client, au bout de 2 min la connexion est rompue et le client se reconnecte, c'est à dire crée une nouvelle connexion, et les paquets qui se sont perdus ne seront pas retransmis
    c'est donc à l'appli (client + serveur) d'avoir un mécanisme pour s'assurer de la reprise du transfert sans erreur, est-ce que le serveur possède un tel mécanisme ?

    alors selon le cas, pour synchroniser des données entre deux bdd on peut mettre en place de la réplication, le tout bien au chaud dans un petit tunnel openvpn par exemple (par expérience openvpn a tendance à bufferiser, ce qui fait qu'en cas de reconnexion on récupère tous les paquets en attente, pour peu que la coupure n'ait pas duré trop longtemps non plus évidemment...)

    s'il s'agit de transférer des fichiers avec de la reprise de transfert n'importe quel serveur ftp fait ça très bien, ou même pourquoi pas un rsync, et à l'inverse si les données sont "sacrifiables" un socat en UDP qui pipe vers un programme de traitement peut être suffisant

    et s'il s'agit juste d'un exo donné par le prof, mieux vaut privilégier netcat (nc-traditionnal, pas le bsd souvent installé par défaut) dans une boucle en bash pourquoi pas... telnet en revanche c'est pas terrible, c'est un protocole à part entière, sensible aux \n et \r\n, qui utilise des codes de contrôle et plutôt utilisé en mode interactif, on devrait se connecter en telnet avec telnet uniquement sur un serveur telnet.


  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    bonsoir a tous pour cette dernière journée de l'année

    Et encore merci pour votre intérêt pour mon problème

    @Tlams : C'est un socket TCP de tête je pourrais recontroler dans les docs constructeurs pour confirmer (ou faire vite une trame wireshark)
    Python j'ai rien contre vu les exemples effectivement ca mache pas mal le travail, néanmoins je connais simplement pas. Je connais peu bash aussi et meme si je maitrise beaucoup mieux le PHP je ne voyais pas resoudre des problèmes de socket ip.

    Pour en revenir a Python vu que tu sembles bien maitriser, as t il une architecture qui fait de lui un bon langage pour stabilité des connexion réseaux?

    @BufferBob : oui c 'est des trames textes dune longueur précises et définies initialement avec la de la configuration.

    mais prenons le cas de TCP quand il y a une déconnexion, le serveur lui ne sait pas qu'il y a un problème réseau et continue d'envoyer des paquets, dont il ne reçoit pas l’acquittement par le client, au bout de 2 min la connexion est rompue et le client se reconnecte, c'est à dire crée une nouvelle connexion, et les paquets qui se sont perdus ne seront pas retransmis
    c'est donc à l'appli (client + serveur) d'avoir un mécanisme pour s'assurer de la reprise du transfert sans erreur, est-ce que le serveur possède un tel mécanisme ?
    C'est tout a fait ca

    alors selon le cas, pour synchroniser des données entre deux bdd on peut mettre en place de la réplication, le tout bien au chaud dans un petit tunnel openvpn par exemple (par expérience openvpn a tendance à bufferiser, ce qui fait qu'en cas de reconnexion on récupère tous les paquets en attente, pour peu que la coupure n'ait pas duré trop longtemps non plus évidemment...)
    La dans notre cas il y a pas 2 bdd. Il ya simplement des données transmises par le serveur. SI un client est la pour les récupérer et les traiter c'est bien, si personne est connecté c'est perdu.
    D'ou le fait comme tu résumais avant que le client doit pouvoir au plus tot détecter une anomalie et régir en conséquence. de manière générale je ne traitement qu'une anomalie reelle : le perte de réseau soit via le switch soit coté serveur. Si le pc client est eteint...pas grand chose a faire.

    je ne suis pas dans un contexte ecole Il s'agit d'une application qui aura un role reel en entreprise. Je suis bien d'accord que telnet n'est pas une solution. Dans mon esprit cela servait plus pour tester les boucles et gestion des déconnexions mais ce 'est pas une solution idéale. Depuis le début l'idéal serait une solution qui puisse récupérer les trames ET les injecter dans une BDD type mysql car j'ai l'intention de faire ensuite un client WEB pour l'utilisateur final

    merci encore pour vos conseils

    Et passer de bonnes fetes!

  18. #18
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par Florent42 Voir le message
    SI un client est la pour les récupérer et les traiter c'est bien, si personne est connecté c'est perdu.
    c'est donc limpide : le client fait ce qu'il peut au mieux, c'est à dire il lit les lignes en permanence et les rebalance là où on veut (echo "update truc set machin where bidule" | mysql mybdd)
    le mieux que le client puisse faire c'est lorsqu'il détecte une déconnexion la relancer et se remettre en écoute.

    au minimum on doit pouvoir faire un truc du genre (non testé/à adapter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while true; do
       nc -w3 $host $port | while read -t1 line; do
          echo "update truc set machin=${line} where bidule" | mysql mybdd
       done
    done
    -w3 doit permettre de considérer la connexion comme morte au bout de 3s de timeout, du coup netcat vautre et on repart pour un tour de boucle while true, basique.

    edit: et on peut faire pareil avec read -t

    bon réveillon,

  19. #19
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2010
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2010
    Messages : 178
    Points : 618
    Points
    618
    Par défaut
    La proposition de BufferBob est simple et très bonne.
    Tu devrais l'utiliser.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Bonjour

    ET meilleurs voeux pour cette nouvelle année

    J'ai testé un peu le script :
    le read -t1 ne marche pas par contre read tout simple marche

    J'ai eu la surprise de voir que la trame arrive en fait sur 3 lignes. J'avais vu les 3 lignes mais je pensais que c'était plus un problème de presentation
    donc en faisant un simple echo de la ligne voici ce que j'ai vu (avec en couleur les 3 lignes) :

    update truc set machin=0LOIU 000243900205050450 0RD 25505 where bidule 001001P
    update truc set machin=V3 0 0 2 1 1S 2D D P 050456 6 where bidule 0 21FAA14
    where biduleet machin=0 0 0 0 0 0 0 0 0

    Par contre une petite partie de chaque ligne est perdue toujours au même endroit avant le "where bidule"
    Peux ton définir une longueur de trame meme si il y a plusieurs lignes?

    J'ai fait un test en déconnectant volontairement le câble réseau du serveur....malheureusement je n'ai aucune deconnexion du netcat, resultat comme telnet il reste connecté dans le vide.

Discussions similaires

  1. [Postfix] Changer le port d'écoute
    Par java_fun dans le forum Administration système
    Réponses: 5
    Dernier message: 08/06/2007, 13h05
  2. Erreur réseau générale.
    Par tribune dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/05/2007, 10h38
  3. Erreur réseau ou erreur disque
    Par lingli dans le forum Bases de données
    Réponses: 9
    Dernier message: 16/05/2006, 23h27
  4. [8.i][Admin]Imposer un port d'écoute
    Par ni0urk dans le forum Oracle
    Réponses: 16
    Dernier message: 17/11/2005, 11h56
  5. Réponses: 13
    Dernier message: 11/10/2004, 10h54

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