8 votes

Décalage de la connexion lors de la connexion à un serveur IRC avec PHP

J'essaie de connecter mon script PHP à IRC, mais il n'arrive pas à s'arrêter. Je suis sur le serveur, donc je sais qu'il fonctionne, mais je ne peux pas dire quel est le problème.

S'agit-il d'une erreur dans mon code ?

<?php

/**
 * Configuration.
 * Pretty self-explanatory
 */

$ircServer = "hub.malvager.com";
$ircPort = "6667";
$ircChannel = "#hackforums";

set_time_limit(0);

$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS);

if ($ircSocket)
{

    fwrite($ircSocket, "USER Orgy orgy.test hfcoder :twBooter\n");
    fwrite($ircSocket, "NICK OrgyBot|" . rand() . "\n");
    fwrite($ircSocket, "JOIN " . $ircChannel . "\n");

    while(1)
    {
        while($data = fgets($ircSocket, 128))
        {
            echo nl2br($data);
            flush();

            // Separate all data
            $exData = explode(' ', $data);

            // Send PONG back to the server
            if($exData[0] == "PING")
            {
                fwrite($ircSocket, "PONG ".$exData[1]."\n");
            }
        }
    }
}
else
{
    echo $eS . ": " . $eN;
}

?>

UPDATE : Apparemment, il fonctionne avec succès sur CERTAINS serveurs, mais pas sur d'autres. fsockopen est autorisé, de même que set_time_limit. Je n'arrive pas à comprendre quel est le problème.

UPDATE : Voici une trace d'itinéraire :

traceroute to hub.malvager.com (69.164.201.185), 30 hops max, 40 byte packets
1  rtr-1.bluehost.com (69.89.16.1)  0.406 ms  0.418 ms  0.438 ms
2  ge-6-8.car2.SaltLakeCity1.Level3.net (4.53.42.5)  1.484 ms  1.515 ms  1.590 ms
3  ae-5-5.ebr1.Denver1.Level3.net (4.69.133.126)  35.117 ms  35.119 ms  35.270 ms
4  ae-2-2.ebr2.Dallas1.Level3.net (4.69.132.106)  39.978 ms  39.938 ms  39.939 ms
5  ae-3-80.edge4.Dallas3.Level3.net (4.69.145.141)  40.070 ms  40.046 ms ae-4-90.edge4.Dallas3.Level3.net (4.69.145.205)  40.040 ms
6  THE-PLANET.edge4.Dallas3.Level3.net (4.59.32.30)  40.171 ms  41.407 ms  40.698 ms
7  te7-2.dsr02.dllstx3.theplanet.com (70.87.253.26)  40.653 ms te9-2.dsr02.dllstx3.theplanet.com (70.87.253.30)  40.454 ms te7-2.dsr02.dllstx3.theplanet.com (70.87.253.26)  40.593 ms
8  * * 6e.ff.5746.static.theplanet.com (70.87.255.110)  40.537 ms
9  52.ff.5746.static.theplanet.com (70.87.255.82)  40.481 ms  40.472 ms  40.459 ms
10  li115-185.members.linode.com (69.164.201.185)  40.450 ms  40.171 ms  40.582 ms

Et la fouille :

; <<>> DiG 9.6.2-RedHat-9.6.2-0.BH <<>> hub.malvager.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34815
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5

;; QUESTION SECTION:
;hub.malvager.com.      IN  A

;; ANSWER SECTION:
hub.malvager.com.   85419   IN  A   69.164.201.185

;; AUTHORITY SECTION:
malvager.com.       85419   IN  NS  ns1.linode.com.
malvager.com.       85419   IN  NS  ns3.linode.com.
malvager.com.       85419   IN  NS  ns2.linode.com.
malvager.com.       85419   IN  NS  ns4.linode.com.
malvager.com.       85419   IN  NS  ns5.linode.com.

;; ADDITIONAL SECTION:
ns1.linode.com.     54252   IN  A   69.93.127.10
ns2.linode.com.     51679   IN  A   65.19.178.10
ns3.linode.com.     41439   IN  A   75.127.96.10
ns4.linode.com.     26259   IN  A   207.192.70.10
ns5.linode.com.     54441   IN  A   109.74.194.10

;; Query time: 4 msec
;; SERVER: 74.220.195.27#53(74.220.195.27)
;; WHEN: Thu Sep 23 16:32:21 2010
;; MSG SIZE  rcvd: 227

NETCAT :

nc: connect to hub.malvager.com port 6667 (tcp) failed: Connection timed out

2voto

Svisstack Points 9001

Vous avez des erreurs.

Est bogué, car en vérifiant strictement le premier résultat de l'explosion, vous explosez par caractère d'espace et dans le protocole d'implémentation d'IRC, toutes les commandes doivent être terminées par un caractère de retour à la ligne, puis le serveur vous les envoie. "PING\n" pas "PING" alors votre $exData est dans cet état.

array(1) {
  [0]=>
  string(5) "PING
"
}

Ensuite, votre $exData[0] == "PING" est faux parce que "PING" n'est pas égal à "PING\n" . La bonne solution n'est pas d'ajouter "\n" à la fin de la commande dans l'analyseur car "\n" n'est pas seulement un marqueur de ligne (pour une mauvaise implémentation du protocole IRC, je le recommande, on ne sait jamais quel marqueur de ligne le développeur du protocole IRC peut utiliser, pensez à Contrôle de serveur IRC Delphi INDY Buggy ), la meilleure solution est de ne pas la contrôler.

if (strstr(strtolower($exData[0]), "ping"))
{ 
    $cmd = "PONG";
    if (sizeof($exData) == 1)
    {
        $cmd .= "\n";
    }
    else for ($Index=1; $Index < sizeof($exData); $Index++)
    {
        $cmd .= " " . $exData[$Index];
    }
    /*
     * Not adding newline marker, because is.
     * already exists in last element of $exData
     * array at last position if for was executed
     */
    fwrite($ircSocket, $cmd);
}

Je changerai le while($data = fgets($ircSocket, 128)) , à la while ($data = fgets($ircSocket)) car dans le cas de noms de serveurs longs, il est possible de dépasser les 128 octets.


Et votre fwrite($ircSocket, "JOIN " . $ircChannel . "\n"); ligne ne fait pas exactement ce que vous voulez, car votre JOIN a été envoyée après la commande USER y NICK le serveur analyse alors votre demande avant que l'utilisateur ne soit enregistré et si l'utilisateur n'est pas enregistré, vous pouvez JOIN vers le canal, les serveurs IRC n'utilisent pas la commande QUEUE failed car cela n'a pas de sens. La meilleure pratique est d'envoyer JOIN après la commande MOTD a été reçue du serveur et après la réception de la commande "left from channel", si vous souhaitez mettre en œuvre une fonctionnalité telle que AUTOJOIN .

// End of /MOTD command.
if (sizeof($exData) > 1) if (strstr($exData[1], "376"))
{
    fwrite($ircSocket, "JOIN " . $ircChannel . "\n");
}

A propos de la conception de votre script, si vous écrivez un bot simple alors je n'ai rien à dire sur ce sujet, mais si vous prévoyez d'écrire un gros morceau de code, vous devriez concevoir votre script d'une autre manière. Vous devez séparer certaines couches comme l'implémentation du protocole IRC et les actions de votre robot IRC. Vous devriez utiliser une classe pour déplacer la responsabilité du protocole IRC vers elle, parce que dans un gros morceau de code, mélanger le contrôle du protocole IRC avec le code des actions de votre bot est agréable. Dette technique .

1voto

Svisstack Points 9001
  1. Installer netcat
  2. Exécuter sur le même appareil nc hub.malvager.com 6667
  3. Analyser les résultats.

Si votre résultat est :

sviss@sviss:~$ nc -v hub.malvager.com 6667
DNS fwd/rev mismatch: hub.malvager.com != li115-185.members.linode.com
hub.malvager.com [69.164.201.185] 6667 (ircd) open
:hub.malvager.com NOTICE AUTH :*** Looking up your hostname...
:hub.malvager.com NOTICE AUTH :*** Found your hostname (cached) 
  1. Installer des produits frais PHP version from SOURCE FILES (ceci est important parce que dans les versions binaires, la version d'apt ou d'autres versions est obsolète) from php.net
  2. Vous pouvez ensuite modifier les valeurs par défaut PHP.ini fichier à accorder fsockopen si le problème n'a pas encore été résolu (je pense qu'avec les paramètres par défaut, il n'y a pas de problème). .ini votre script fonctionnera correctement).

Si votre résultat représente une erreur de connexion, pensez à l'exemple suivant :

sviss@sviss:~$ nc -v hub.malvager.com 6668
DNS fwd/rev mismatch: hub.malvager.com != li115-185.members.linode.com
hub.malvager.com [69.164.201.185] 6668 (?) : Connection refused
  1. Faire tracert hub.malvager.com et de poster les résultats dans votre question, alors je dois lire ceci et mettre à jour ma réponse.

  2. Si vous travaillez sur POSIX faire dig hub.malvager.com et de poster les résultats dans votre question, alors je dois lire ceci et mettre à jour ma réponse.

  3. Si vous travaillez sur Fenêtres faire nslookup hub.malvager.com et de poster les résultats dans votre question, alors je dois lire ceci et mettre à jour ma réponse.

  4. Si vous voulez analyser ce résultat seul, sans vous soucier des résultats de cette commande, j'ai posté ceci.

Résultat de dig hub.malvager.com :

; <<>> DiG 9.5.1-P3 <<>> hub.malvager.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33134
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;hub.malvager.com.              IN      A

;; ANSWER SECTION:
hub.malvager.com.       84935   IN      A       69.164.201.185

;; Query time: 17 msec
;; SERVER: 62.179.1.62#53(62.179.1.62)
;; WHEN: Wed Sep 22 18:28:57 2010
;; MSG SIZE  rcvd: 50

Résultat de tracert hub.malvager.com sur POSIX :

traceroute to hub.malvager.com (69.164.201.185), 30 hops max, 40 byte packets
 1  10.10.10.1 (10.10.10.1)  1.428 ms  1.861 ms  2.287 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  *  (84.116.252.205)  145.057 ms  145.557 ms
 8  84.116.132.53 (84.116.132.53)  141.189 ms  142.263 ms  143.312 ms
 9  84.116.132.230 (84.116.132.230)  143.827 ms  169.115 ms *
10  us-nyc01b-rd1-pos-12-0.aorta.net (213.46.160.242)  141.656 ms  142.722 ms *
11  us-nyc01b-ri1-ge-0-1-0.aorta.net (213.46.190.178)  144.280 ms  146.999 ms  147.512 ms
12  be-20-203-pe01.111eighthave.ny.ibone.comcast.net (68.86.88.73)  148.066 ms  148.570 ms  133.769 ms
13  68.86.87.109 (68.86.87.109)  133.962 ms  137.222 ms  137.218 ms
14  pos-0-9-0-0-cr01.ashburn.va.ibone.comcast.net (68.86.87.61)  142.599 ms  142.608 ms  142.624 ms
15  pos-1-5-0-0-cr01.atlanta.ga.ibone.comcast.net (68.86.87.78)  144.131 ms  141.138 ms  144.306 ms
16  pos-1-10-0-0-cr01.dallas.tx.ibone.comcast.net (68.86.86.129)  165.506 ms  166.013 ms  169.184 ms
17  pos-0-3-0-0-pe01.1950stemmons.tx.ibone.comcast.net (68.86.86.154)  170.688 ms  171.203 ms  174.275 ms
18  theplanet-cr01.dallas.tx.ibone.comcast.net (75.149.228.2)  183.499 ms  184.011 ms  187.376 ms
19  te9-1.dsr02.dllstx3.theplanet.com (70.87.253.22)  187.883 ms  188.390 ms  174.093 ms
20  * * *
21  56.ff.5746.static.theplanet.com (70.87.255.86)  173.691 ms  174.396 ms  174.679 ms
22  li115-185.members.linode.com (69.164.201.185)  174.702 ms  175.541 ms  174.186 ms

0voto

Petah Points 18432

Le serveur peut exiger une réponse ident. J'ai également exécuté le script script et la connexion s'est bien déroulée. Il s'agit peut-être d'un problème de pare-feu.

0voto

Tom Points 1705

Avez-vous essayé d'utiliser telnet pour simuler le comportement de votre robot et voir ce qui se passe ? Connectez-vous, tapez (ou copiez-collez) exactement ce que votre robot produirait et fixez l'écran pendant quelques minutes.

0voto

Herr K Points 990

cette

Le code a un serveur IRC qui fonctionne parfaitement. J'opterais pour cette solution.

PS : Si vous ne l'aimez pas, soyez gentil et ne le dénigrez pas. Merci de votre compréhension.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X