PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Vérifier l'existance du socket ?
Vérifier l'existance du socket ?
Iniciado por Maxime, 02,jul. 2019 15:28 - 9 respuestas
Miembro registrado
106 mensajes
Publicado el 02,julio 2019 - 15:28
Bonjour a tous ,

Je possède ce morceau de code :

///// partie à sécuriser
//Envoi de la demande de lecture
SI SocketEcrit(Nom_socket,MbusQuery)= Vrai ALORS


//Lecture de la réponse automate et traitement
Reponse_autom=SocketLit(Nom_socket,Faux)
//Tailleréponse=Taille(Reponse_autom)*****************????? SERT A QUOI?
nNb_octet_reponse=Reponse_autom[[9]]

///// fin de partie à sécuriser


J'aimerai pouvoir sécuriser cette partie en cas de perte de connexion supérieur a un temps fixé ( 10 secondes actuellement )
j'ai lu que le socket tant qu'on le ferme pas il reste crée même si il ne retourne plus aucune information sauf qu'actuellement je ne sais pas gérer le cas ou j'ai cette perte de connexion.
Il me faudrait une solution pour si mon socket est ouvert de vérifié sa disponibilité à savoir si il répond plus que je lance la fermeture du coups pour le re-crée .

Cordialement Maxime
Publicado el 02,julio 2019 - 18:29
Bonjour,

De mémoire je faisais une lecture pendant un temp défini, juste avant
la lecture sur la socket je lancais un chrono et analysais ce temps
juste après que SocketLit ait rendu la main. si il n'y a pas de Buffer
lu et que le temps est bien inférieur à l'attente demandée à la
fonction de lecture c'est que le lien est rompu

A tester...

sinon si tu développes les 2 applis qui communiquent ensemble alors il
faut passer par les trames de vie
Miembro registrado
106 mensajes
Publicado el 03,julio 2019 - 10:02
Bonjour ,

Je ne sais pas comment le traité l'erreur que j'ai lors d'une perte de connexion est : " un élément de type 'buffer' ne peut pas être converti vers le type 'entier sans signe sur 1 octet' et cette erreur fait planté le programme .

Je suis novice Windev
Cordialement Maxime
Miembro registrado
261 mensajes
Publicado el 03,julio 2019 - 11:04
La fonction "SocketExiste()" retourne vrai tant que la Socket créée n`a pas été fermée par la fonction "SocketFerme()". En cas d`interruption de la communication, "SocketExiste()" peut retourner un résultat positif, bien que le dialogue soit arrête.

Pour tester la validité de la connexion, il faut utiliser la fonction "SocketClientInfo()".

--
Baptiste CLOART
Freelance
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
www.blv-tech.com
Miembro registrado
106 mensajes
Publicado el 03,julio 2019 - 14:08
Bonjour ,

Ce cas ne marche pas pour moi car je passe par un socketconnecte et le socketclientinfo demande un crée ou accepte .
Mon service va se connecté sur l'automate et l'automate me renvoie les informations demandées .

Cordialement Maxime
Miembro registrado
106 mensajes
Publicado el 04,julio 2019 - 15:17
est-il egalement possible de vidé le contenu d'un buffer sur un protocole modbus tcp/ip ?

Cordialement Maxime
Miembro registrado
106 mensajes
Publicado el 05,julio 2019 - 11:53
Bonjour ,

après plusieurs essaye non satisfaisant mon programme plante soit sur :

nNb_octet_reponse=Reponse_autom[[9]]

Me renvoyant cette erraur : " un élément de type 'buffer' ne peut pas être converti vers le type 'entier sans signe sur 1 octet"

soit

SI SocketEcrit(Nom_socket,MbusQuery)= Vrai ALORS


Et la un coups j'ai eux le socket c'est bien fermé mais ne veux plus s'ouvrir soit "Connexion reinitialisée par l'autre partie ( WSAECONNRESET )"

Quelqu'un aurai une idée ?

Cordialement Maxime
Miembro registrado
106 mensajes
Publicado el 08,julio 2019 - 12:16
Bonjour ,

J'ai trouvé ma solution qui semble être fonctionnelle.

Merci pour votre aide

Cordialement Maxime
Publicado el 16,octubre 2019 - 12:52
Bonjour,

J'essaye également la communication avec un automate en Modbus TCP et j'ai le même message d'erreur que toi Maxime, soit : nNb_octet_reponse=Reponse_autom[[9]]

Me renvoyant cette erraur : " un élément de type 'buffer' ne peut pas être converti vers le type 'entier sans signe sur 1 octet"

Pourrais-tu me dire comment tu as trouvé une solution ?

Merci d'avance,
Miembro registrado
106 mensajes
Publicado el 16,octubre 2019 - 14:29
Bonjour Nathan ,

J'ai réglé mon problème assez facilement sans voir si le socket était présent ou non .
Avant la lecture sur le socket je test ma connexion via des variables si mes variables renvoi le bon resultat alors je commence ma lecture sur le socket .
Ensuite je test le " Reponse_autom[[9]] " si j'ai pas de réponse ou un message vide je lance ma procédure de fermeture du socket en inscrivant l'erreur et relance une connexion dessus afin de règle mes problèmes éventuelles de déconnexion.
SI Reponse_autom[[9]]="" ALORS
HRAZ(HISTO_CONNEXION)
HISTO_CONNEXION.DATE_HEURE_MAJ=DateHeureSys()
HISTO_CONNEXION.INFO_CONNEXION="Erreur connexion : Socketlit vide"
HAjoute(HISTO_CONNEXION)

//FERMETURE DU SOCKET
SocketFerme(Nom_socket)

//MISE A JOURS ETAT MACHINE
HLitPremier(ETAT_COMPTEUR_ATELIER,ID_POS_MACHINE)
TANTQUE PAS HEnDehors
ETAT_COMPTEUR_ATELIER.DATE_HEURE_MAJ=DateHeureSys()
ETAT_COMPTEUR_ATELIER.ID_ETAT_MACHINE=10 //Erreur connexion
HModifie(ETAT_COMPTEUR_ATELIER)
HLitSuivant(ETAT_COMPTEUR_ATELIER,ID_POS_MACHINE)
FIN

//NOUVELLE CONNEXION
gbConnexionOK=Faux
SI CONNEXION_AUTOMATE()= Vrai ALORS
HRAZ(HISTO_CONNEXION)
HISTO_CONNEXION.DATE_HEURE_MAJ=DateHeureSys()
HISTO_CONNEXION.INFO_CONNEXION="Connexion automate OK"
HAjoute(HISTO_CONNEXION)
RETOUR
FIN
FIN


En espérant t'avoir éclairé ou aidé .