sockets en NS.
#1
Bonjour,

Voilà j’ai un souci enfin cela fait quelque jours que je penche sur le système de namespace en sockets.

Je m’explique plus clairement.
En faite j’ai un système de sockets (ce qui me permets de connecté une socket).

Jusque la aucun problème le tout codé modifié pas de soucis.
Mais il se trouve que j’ai une erreur en PL.

J’ai tenté de rechercher cette erreur mais sans aucun succès.
J’ai demandé divers aides mais aucune na été concluante.

Alors donc je post en espérant que vous pourrez m’aider.
Donc voici mon erreur que mon robot me transmet en PL :

Citation :[16:30:18] <Aurore> [15:30:40] Tcl error in script for 'timer4':
[16:30:18] <Aurore> [15:30:40] invalid command name "checkconnect"

Erreur transmise lors d’un .rehash suivi d’un .restart

Voici le code TCL :

tcl
namespace eval socks {
 
#********************#
# Service.Socket 1.0 #
#********************#

#**************************#
# Information link reseau. #
#**************************#
 
set aurore(serv) "Aurore.****.fr"
set aurore(ip) "ip"
set aurore(port) "port"
set aurore(pwdlink) "pass"
set aurore(info) "Aurore Services"

#****************************#
# Configuration des sockets. #
#****************************#
 
set aurore(nick) "Hera" 
set aurore(identd) "Hera" 
set aurore(host) "Services.****.fr"
set aurore(nom) "Services-Log"

#***************************#
# Salon de log des sockets. #
#***************************#
 
set aurore(log) "#Services"
set aurore(quit01) "Redemarage Aurore-Service."
set aurore(quit02) "Fermeture Aurore-Service."

#****************************************#
# Lancement de la procédure des sockets. #
#****************************************#
 
utimer 1 checkconnect
proc checkconnect {} {
	if {![info exists aurore(idx)]} {
          xconnect:serv
	} else {
		utimer 30 [namespace current]::checkconnect
	}
}
 
 
proc xconnect:serv {} {
	set aurore(idx) "[connect $::socks::aurore(ip) $::socks::aurore(port)]"
	putdcc $aurore(idx) "PASS $::socks::aurore(pwdlink)"
	putdcc $aurore(idx) "SERVER $::socks::aurore(serv) 1 [unixtime] [unixtime] J09 ACAA\] +s :$::socks::aurore(info)"
	putdcc $aurore(idx) ":$::socks::aurore(serv) NICK $::socks::aurore(nick) '' '' $::socks::aurore(identd) $::socks::aurore(host) $::socks::aurore(serv) '' :$::socks::aurore(nom)"
	putdcc $aurore(idx) ":$::socks::aurore(nick) MODE $::socks::aurore(nick) +owsgkd"
	putdcc $aurore(idx) ":$::socks::aurore(nick) JOIN $::socks::aurore(log)"
	putdcc $aurore(idx) ":$::socks::aurore(nick) MODE $::socks::aurore(log) +ntsv $::socks::aurore(nick)"	
	control $aurore(idx) controling_server
	utimer 10 verify
 
}

#***********************************#
# Verify si le serveur est Connecté #
#***********************************#
 
proc verify {} {
	if {[valididx $aurore(idx)]} {
		utimer 30 verify
	} else {
    xconnect:serv
	}
}
 
proc valididx {idx} {
	set r 0
	foreach j [dcclist] {
		if {[lindex $j 0] == $idx} {
			set r 1
		}
	}
	return $r
}
 
 
proc controling_server {idx arg} { 
	regsub -all {\\} $arg {\\\\} arg
        regsub -all {\{} $arg {\{} arg
        regsub -all {\}} $arg {\}} arg
        regsub -all {\]} $arg {\]} arg
        regsub -all {\[} $arg {\[} arg
        regsub -all {\"} $arg {\"} arg
        regsub -all {\`} $arg {\`} arg
	    set arg1 "[lindex $arg 0]"
	    set arg2 "[lindex $arg 1]"
	    set arg3 "[lindex $arg 2]"
	    set arg4 "[lindex $arg 3]"
	    set arg5 "[lindex $arg 4]"
	    set arg6 "[lindex $arg 5]"
	    set arg7 "[lindex $arg 6]"
	    set arg8 "[lindex $arg 7]"
	    set arg10 "[string trim [lrange $arg 3 end] :]"
	if {$arg2=="PING"} {
   	putdcc $aurore(idx) ":$::socks::aurore(serv) PONG $::socks::aurore(ip) :$::socks::aurore(serv)"
    }	
 
}
 
#**********************#
# Restart des sockets. #
#**********************#
 
bind evnt - prerestart restart1
proc restart1 {} {
	putdcc $aurore(idx) ":$::socks::aurore(serv) SQUIT $::socks::aurore(serv) :Restart Sockets."
}
 
bind evnt - restart restart2
proc restart2 {arg} {
	xconnect:serv
}
 
#********************#
# Rehash du Service. #
#********************#
 
bind dcc n xrehash eggy:xrehash
proc eggy:xrehash {nick idx arg} {
    putdcc $idx "\002Rehash de Aurore-Service et des fichiers\002"
        utimer 4 rehash
}
 
#*********************#
# Restart du Service. #
#*********************#
 
bind dcc n xrestart eggy:xrestart
proc eggy:xrestart {nick idx arg} {
        putdcc $idx "\002Redémarrage de Aurore-service\002"
    if {[valididx $aurore(idx)]} {
        putdcc $aurore(idx) ":$::socks::aurore(nick) QUIT :$::socks::aurore(quit01)"
        putdcc $aurore(idx) ":$::socks::aurore(serv) SQUIT :$::socks::aurore(serv)"
	  foreach kill [utimers] { 
            if {[lindex $kill 1]=="verification"} { killutimer [lindex $kill 2] }
      }
    }
    xconnect:serv
 
}
 
#*****************#
# Die du Service. #
#*****************#
 
bind dcc n xdie eggy:xdie
proc eggy:xdie {nick idx arg} {
        putdcc $idx "\002Arrêt de  Aurore-Service\002"
    if {[valididx $aurore(idx)]} {
        putdcc $aurore(idx) ":$::socks::aurore(nick) QUIT : $::socks::aurore(quit02)"
        putdcc $aurore(idx) ":$::socks::aurore(serv) SQUIT :$::socks::aurore(quit02)"
	  foreach kill [utimers] { 
            if {[lindex $kill 1]=="verification"} { killutimer [lindex $kill 2] }
      }
    }
}
 
#****************************#
# Fin du Service Sockets 1.0 #
#****************************#
 
}
putlog "\0031Service Sockets 1.0 \0034Chargé."



Si quelqu’un aurait une idée pour me guider merci d’avance :)
Répondre Avertir
#2
Hypothèse stupide: est-ce que les timers n'appelleraient pas un autre namespace, et donc [namespace current] n'est plus bon ?
Dans ce cas, il faudrait peut-être aller voir du côté de [namespace export] ou de [namespace origin] ?

Ou bien une erreur plus bête, tu ne supprimes pas les timers avant un rehash ou un restart.
Répondre
#3
heu.. y'a absolument aucun autre namespace.
Donc le fait de faire namespace import ne servirai à rien comme j'ai rien en autre code tcl à importer.
Répondre Avertir
#4
salut,

timer et utimer s’exécutent dans le namespace global! donc
tcl
utimer 1 checkconnect


devient
tcl
utimer 1 [namespace current]::checkconnect


Répondre Avertir
#5
Salut,

Oui j'ai modifié comme tu la dit mais ça me donne d'autre erreur :

Citation :[18:19:18] <Aurore> [17:19:40] Erreur tcl [controling_server]: invalid command name "controling_server"
[18:19:18] -irc.****.fr- *** Notice -- Link with Aurore.****.fr cancelled: Read Error: Connection reset by peer
[18:19:18] -irc.****.fr- *** Notice -- Net break: irc.****.fr Aurore.****.fr (Read Error: Connection reset by peer)
[18:19:28] <Aurore> [17:19:50] Tcl error in script for 'timer10':
[18:19:28] <Aurore> [17:19:50] invalid command name "verify"

Donc j'ai modifié la commande Vérify et j'ai toujours la même erreur :°

voici la modif :

tcl
proc verify {} {
	if {![valididx $aurore(idx)]} {
		utimer 30 [namespace current]::verify
	} else {
    xconnect:serv
	}
}


Répondre Avertir
#6
même chose pour le control
tcl
control $aurore(idx) [namespace current]::controling_server
   utimer 10 [namespace current]::verify



édit: il y en a surement d autres, je n’ai pas lut le code
Répondre Avertir
#7
effectivement il y en a d'autres, tous les binds,
ca aussi:
tcl
if {[valididx $aurore(idx)]} {


tu met le namespace pour les vars la ou il y en a pas besoin mais tu ne le met pas la ou il le faut...
Répondre Avertir
#8
ça c'est inutile aussi (ça risque même de foutre le bordel)
tcl
bind evnt - restart restart2
proc restart2 {arg} {
   xconnect:serv
}


Répondre Avertir
#9
oui je viens de modifié comme tu la dit et sa fonctionne bien.

Par contre tu ma dit une erreur au niveau de :

tcl
if {[valididx $aurore(idx)]} {



je ne vois pas.
mettre le nom du NS dans la variable idx qui et appeler c'est ça que tu veux dire ?

edit : genre
tcl
if {[valididx $::socks::aurore(idx)]} {



ou
tcl
if {[valididx $::aurore(idx)]} {



Perso je dirait la première.
Répondre Avertir
#10
salut,

par exemple ces 2 lignes:
tcl
if {[valididx $aurore(idx)]} {
        putdcc $aurore(idx) ":$::socks::aurore(nick) QUIT : $::socks::aurore(quit02)"



tu mets le ns pour le putdcc mais pas pour le valididx (d’ailleurs au passage dans ce cas la il est inutile de le mettre vu que tu te trouves déjà dedans)
ce qui donnerai:
tcl
if [valididx $aurore(idx)] {
        putdcc $aurore(idx) ":$aurore(nick) QUIT : $aurore(quit02)"


Répondre Avertir
#11
oui donc j'ai modifié comme tu as dit là je n'es plus d'erreur mise à part pour le prerestart.

alors j'ai modifié pas réussi et lorsque je commente les lignes du prerestart voir ce que celà donne la socket ne se connect pas.. vive les prise de tête :°

J'ai même modifié le système de connection de la socket en la passant par catch mais sa change rien aussi..
Et par exemple si je tente de faire un .xrestart pour restart le service ça me dit ça en Pl :

Citation :[20:02:03] ( alias_angelius ) .xrestart
[20:02:04] <Aurore> Redémarrage de Aurore-service
[20:02:04] <Aurore> [19:02:26] Tcl error [::socks::eggy:xrestart]: can't read "aurore(idx)": no such variable

Donc j'ai tenter de regarder l'erreur au plus près ça viens du valididx qui es :

tcl
if [valididx $aurore(idx)] {



J'avoue que la c'est à rien y comprendre.
Répondre Avertir
#12
donc je reviens sur ce que je disais hier (désolé j étais un peu fatigué j ai oublié un morceau)
tcl
if [valididx [set [namespace current]::aurore(idx)]] {
        putdcc $aurore(idx) ":$aurore(nick) QUIT : $aurore(quit02)"


Répondre Avertir
#13
tu devrais aussi déclarer ta variable "aurore"
tcl
# à la création du namespace
namespace eval socks {
    variable aurore
#.....

 
# et au début de chaque procédures
proc checkconnect {} {
    variable aurore
#....
}
 
 
proc xconnect:serv {} {
    variable aurore
#.....
}
 
etc...


Répondre Avertir
#14
Pourquoi redéclarer au début de chaque procédure ?
Si je me souviens bien, la déclaration dans une procédure sert lorsqu'on crée une variable et que l'on veut qu'elle appartienne au NS et non pas juste à la procédure. Si elle est déjà déclarée dans le NS, ça ne sert à rien de le refaire.

Maintenant, je peux me tromper lourdement.
Répondre
#15
salut,

nan ça fonctionne un peu comme global, tu dois l appeler à chaque procédures

édit: d'ailleurs au passage variable ne crée pas la var, il alloue juste le block mémoire, celle ci n’existe pas tend qu'elle n'est pas set, info exists retournera 0
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté