Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fsockopen() et etat de la connexion

7 réponses
Avatar
DrEaMeRs
Hello !

Je suis en train de creer un petit script en php et j'ai un petit soucis.
Mon programme se connecte a un serveur irc via fsockopen, tout marche
tres bien, mais j'aimerai inclure une reconnection automatique en cas de
coupure. Malheureusement lorsque il y a une coupure de la connexion avec
le serveur le socket reste en CLOSE_WAIT lorsque je fait un netstat pour
vérifier et ne se ferme pas.
Est-il possible de récupérer l'etat du socket afin de verifier que la
connexion est toujours etabli correctement ?

precision :
le fichier n'est pas executé dans un navigateur mais dans un shell sur
un server linux (en ligne de commande donc) et il n'y a pas de fin de
script qui referme automatiquement le socket etant donné qu'il s'agit
d'un bot qui reste perpétuellement connecté au serveur irc a l'aide
d'une boucle infini.
pour resumé je cherche a savoir comment verifier l'etat d'un socket pour
pouvoir lui faire arreter la boucle.

le programme ressemble a cela (je n'ai mis que ce qui nous interesse ici) :

<?
while (1) {
sleep(1);
$sock = fsockopen($server, $port);
//connexion au server etc
while ($sock) {
//boucle infini
//traitement des données reçu du serveur
}
fclose($sock);
}

il me manque juste le if me permettant de verifier l'etat de la
connexion du socket pour en cas de besoin le faire sortir de la boucle
et lui faire recommencer l'autre.

7 réponses

Avatar
Kevin
Hello !

Je suis en train de creer un petit script en php et j'ai un petit soucis.
Mon programme se connecte a un serveur irc via fsockopen, tout marche
tres bien, mais j'aimerai inclure une reconnection automatique en cas de
coupure. Malheureusement lorsque il y a une coupure de la connexion avec
le serveur le socket reste en CLOSE_WAIT lorsque je fait un netstat pour
vérifier et ne se ferme pas.
Est-il possible de récupérer l'etat du socket afin de verifier que la
connexion est toujours etabli correctement ?

precision :
le fichier n'est pas executé dans un navigateur mais dans un shell sur
un server linux (en ligne de commande donc) et il n'y a pas de fin de
script qui referme automatiquement le socket etant donné qu'il s'agit
d'un bot qui reste perpétuellement connecté au serveur irc a l'aide
d'une boucle infini.
pour resumé je cherche a savoir comment verifier l'etat d'un socket pour
pouvoir lui faire arreter la boucle.

le programme ressemble a cela (je n'ai mis que ce qui nous interesse ici) :

<?
while (1) {
sleep(1);
$sock = fsockopen($server, $port);
//connexion au server etc
while ($sock) {
//boucle infini
//traitement des données reçu du serveur
}
fclose($sock);
}

il me manque juste le if me permettant de verifier l'etat de la
connexion du socket pour en cas de besoin le faire sortir de la boucle
et lui faire recommencer l'autre.


while (!feof($sock)) {
(ca devrait marcher un peu mieux deja)

puis sinon regarde du coté de "stream_get_meta_data" (
http://fr2.php.net/manual/fr/function.stream-get-meta-data.php )

bonne journée

Kevin

Avatar
loufoque
DrEaMeRs a dit le 14/08/2004 14:28:

Malheureusement lorsque il y a une coupure de la connexion avec
le serveur le socket reste en CLOSE_WAIT lorsque je fait un netstat pour
vérifier et ne se ferme pas.
L'état de la socket n'est réinitialisé que lorsque tu reçois/envoies des

données (enfin il me semble).
Donc si dans les deux dernières minutes, tu n'as rien reçu ni rien
envoyé, tu peux déjà considérer que t'as été déconnecté, et pour
vérifier cela tu envoies un message quelconque au serveur.
Sinon, avec les sockets, la connexion est terminée quand tu reçois une
chaîne vide '' (attention à faire la comparaison avec ===, pour éviter
false). Et avec IRC, le serveur te prévient des déconnexions en envoyant
'Error: Closing Link machin truc'.

Sinon si tu veux créer un bot IRC à l'aide d'une puissante API
(attention gros coup de pub) tu peux utiliser phpMyBot, trouvable sur
sourceforge (attention, documentation minime). Tu pourrais d'ailleurs
vraiment en profiter avec un shell sous linux, car tu pourras utiliser
le forking (il y a un système de communication inter-processus intégré,
c'est ce sur quoi j'ai le plus travaillé, avec le DCC).

Avatar
DrEaMeRs
merci pour vos réponses

Kevin : le !feof m'a suffit en fait, que ce soit une deco par le serveur
(un kill par exemple) ou une perte de la connexion internet le bot
cherche a se reconnecter immediatement comme je le désiré.

loufoque : merci pour le coup de pub ;), mais je fait uniquement un bot
de statistiques, un peu a la maniere de "pisg" si tu connais, sauf que
la c'est logué dans une bdd direct avec le bot php, sans passer par un
client irc supplémentaire, et les stats généré en temps réel et non pas
a intervalle regulier. et puis j'ai tout codé moi meme, c'est ce qui
m'interesse le plus, reprendre de l'existant ne m'interesse pas, il ne
manque plus que les raw mode a voir et c'est tout bon (pour separer les
voice/op/ban essentiellement). ensuite je pourrai m'attaquer a la partie
"visible", la page des stats. enfin tout ca pour dire que les dcc et
toutes les autres "fonctionnalité" de l'irc ne m'interesse pas vraiment,
pas pour l'instant en tout cas.
Avatar
loufoque
DrEaMeRs a dit le 17/08/2004 08:46:

Kevin : le !feof m'a suffit en fait, que ce soit une deco par le serveur
ou une perte de la connexion internet


J'ai essayé avec le champ eof de stream_get_meta_data(), ce qui me
semble plus correct, et ça ne détecte pas les pertes de connexions si on
ne "rafraichit" pas la socket en envoyant un message.
Enfin c'est le comportement avec une socket non bloquante, avec une
socket bloquante c'est peut-être différent.

Autre chose, je ne pense pas que se reconnecter systématiquement soit
une bonne idée. Si le serveur décide de te tuer, parce que par exemple
il y a déjà trop de connexions pour ton IP ou que sais-je, tout ce que
tu obtiendras en essayant de te reconnecter c'est un bannissement.

Avatar
DrEaMeRs
j'ai fait ca comme ca en fait :

while (1) {
$sock = fsockopen($server, $port);
//reste du processus de connexion au serveur
while ($sock) {
if (feof($sock)) {
fclose($sock);
break;
}
//traitement des données reçu
}
while (1) {
//traitement des données reçu
}
fclose($sock);
}

bien sur c'est a améliorer mais pour l'instant le principal c'est qu'il
se reconnecte, apres qu'il reessaye ce n'est pas le plus important, au
contraire, je prefere qu'il reessaye meme si il est banni.

pour stream_get_meta_date() ils disent dans l'aide qu'il est preferable
de se servir de la fonction eof, alors je ne sais pas...

sinon il faudra que je rajoute un compteur pour qu'il arrete de tenter
de se reconnecter au bout d'un certain nombre de fois, mais ce n'est pas
le plus important des choses a faire pour le moment.




DrEaMeRs a dit le 17/08/2004 08:46:

Kevin : le !feof m'a suffit en fait, que ce soit une deco par le
serveur ou une perte de la connexion internet



J'ai essayé avec le champ eof de stream_get_meta_data(), ce qui me
semble plus correct, et ça ne détecte pas les pertes de connexions si on
ne "rafraichit" pas la socket en envoyant un message.
Enfin c'est le comportement avec une socket non bloquante, avec une
socket bloquante c'est peut-être différent.

Autre chose, je ne pense pas que se reconnecter systématiquement soit
une bonne idée. Si le serveur décide de te tuer, parce que par exemple
il y a déjà trop de connexions pour ton IP ou que sais-je, tout ce que
tu obtiendras en essayant de te reconnecter c'est un bannissement.



Avatar
DrEaMeRs

DrEaMeRs a dit le 17/08/2004 08:46:

Kevin : le !feof m'a suffit en fait, que ce soit une deco par le
serveur ou une perte de la connexion internet




J'ai essayé avec le champ eof de stream_get_meta_data(), ce qui me
semble plus correct, et ça ne détecte pas les pertes de connexions si
on ne "rafraichit" pas la socket en envoyant un message.
Enfin c'est le comportement avec une socket non bloquante, avec une
socket bloquante c'est peut-être différent.

Autre chose, je ne pense pas que se reconnecter systématiquement soit
une bonne idée. Si le serveur décide de te tuer, parce que par exemple
il y a déjà trop de connexions pour ton IP ou que sais-je, tout ce que
tu obtiendras en essayant de te reconnecter c'est un bannissement.



oups petite erreur dans mon code, il fallait voir :
while (1) {
$sock = fsockopen($server, $port);
//reste du processus de connexion au serveur
while ($sock) {
if (feof($sock)) {
fclose($sock);
break;
}
//traitement des données reçu
}
}



Avatar
DrEaMeRs
DrEaMeRs a dit le 17/08/2004 08:46:

Kevin : le !feof m'a suffit en fait, que ce soit une deco par le
serveur ou une perte de la connexion internet



J'ai essayé avec le champ eof de stream_get_meta_data(), ce qui me
semble plus correct, et ça ne détecte pas les pertes de connexions si on
ne "rafraichit" pas la socket en envoyant un message.
Enfin c'est le comportement avec une socket non bloquante, avec une
socket bloquante c'est peut-être différent.

Autre chose, je ne pense pas que se reconnecter systématiquement soit
une bonne idée. Si le serveur décide de te tuer, parce que par exemple
il y a déjà trop de connexions pour ton IP ou que sais-je, tout ce que
tu obtiendras en essayant de te reconnecter c'est un bannissement.



j'ai fait ca comme ca en fait :

while (1) {
$sock = fsockopen($server, $port);
//reste du processus de connexion au serveur
while ($sock) {
if (feof($sock)) {
fclose($sock);
break;
}
//traitement des données reçu
}
}

bien sur c'est a améliorer mais pour l'instant le principal c'est qu'il
se reconnecte, apres qu'il reessaye ce n'est pas le plus important, au
contraire, je prefere qu'il reessaye meme si il est banni.

pour stream_get_meta_date() ils disent dans l'aide qu'il est preferable
de se servir de la fonction eof, alors je ne sais pas...

sinon il faudra que je rajoute un compteur pour qu'il arrete de tenter
de se reconnecter au bout d'un certain nombre de fois, mais ce n'est pas
le plus important des choses a faire pour le moment.