使用PHP连接到IRC服务器时连接超时

时间:2010-09-16 14:01:35

标签: php irc

我正在尝试将我的PHP脚本连接到IRC,但它会保持超时。我服务器上,所以我知道它已启动并运行,我无法分辨出问题所在。

我的代码中可能是错误吗?

<?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;
}

?>

更新:显然,它已成功运行在某些服务器上,而不是其他服务器上。允许使用fsockopen,set_time_limit也是如此。我无法弄清楚问题是什么。

更新:这是一条跟踪路线:

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

挖掘:

; <<>> 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

12 个答案:

答案 0 :(得分:2)

您有一些错误。

有错误,因为严格检查首先爆炸结果,你通过空格字符爆炸并且在IRC实现协议中所有命令必须由换行符终止,然后服务器发送给你"PING\n"而不是{ {1}}然后您的"PING"数组处于此状态。

$exData

然后您的array(1) { [0]=> string(5) "PING " } 为假,因为$exData[0] == "PING"不等于"PING"。 好的解决方案是不将"PING\n"添加到解析器的命令末尾,因为"\n"不仅是换行符标记(对于不良的IRC协议实现我建议这样做,你永远不知道新行标记IRC协议开发人员可能会使用什么,想想 Delphi INDY Buggy IRC服务器控制),更好的解决办法就是不检查她。

"\n"

我会将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); } 更改为while($data = fgets($ircSocket, 128)),因为在长服务器名称中,您只能溢出128个字节。


并且您的while ($data = fgets($ircSocket))行没有完全按照您的意愿行事,因为您的fwrite($ircSocket, "JOIN " . $ircChannel . "\n");命令是在JOINUSER命令之后发出的,然后服务器解析您的请求之前用户已注册,如果用户未注册,您可以NICK进行通道,IRC服务器不会出现QUEUE failed命令,因为这没有任何意义。最好的做法是在从服务器收到JOIN命令之后发送JOIN命令,如果你想要实现像MOTD这样的功能,那么在接收到来自channel命令的左边之后也是如此。 / p>

AUTOJOIN

关于你的脚本设计,如果你编写简单的bot,那么我在本主题中没有任何要说的内容,但如果你计划编写一些大的代码,你应该以其他方式设计你的脚本。您必须分离一些层,如IRC协议实现和IRC Bot操作。你应该使用一些类来将IRC协议的责任转移到她身上,因为在更大的代码中混合IRC协议控制与你的机器人动作代码是很好的技术债务

答案 1 :(得分:1)

  1. 安装netcat
  2. 在同一设备nc hub.malvager.com 6667
  3. 上运行
  4. 分析结果。
  5. 如果您的结果是:

    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. 从SOU​​RCE FILES安装新的PHP版本(这很重要,因为来自apt的二进制版本或某些版本已被弃用)来自php.net
    2. 然后,如果问题尚未解决,您可以修改默认PHP.ini文件以调整fsockopen设置(我认为使用默认的.ini文件,您的脚本将正常工作)。
    3. 如果您的结果表示某些连接错误,则有人会认为这样的示例:

      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. 执行tracert hub.malvager.com并将结果发布到您的问题中,然后我必须阅读此内容并更新我的答案。

      2. 如果您正在使用 POSIX 执行dig hub.malvager.com并将结果发布到您的问题中,那么我必须阅读此内容并更新我的回答。

      3. 如果您正在使用 WINDOWS 执行nslookup hub.malvager.com并将结果发布到您的问题中,那么我必须阅读此内容并更新我的回答。

      4. 如果你想单独分析这个结果,那么从你的观点来看,这个命令的结果是我的结果,然后我发布这个。

      5. 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
        

        POSIX 上的tracert hub.malvager.com的结果:

        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
        

答案 2 :(得分:0)

服务器可能需要ident响应。此外,我运行该脚本,它连接正常。也许是防火墙问题。

答案 3 :(得分:0)

根据rfc1459,IRC协议中的消息结束是¨\ r \ n,而不仅仅是¨\ n。有些服务器实现可能会拒绝您的消息。

答案 4 :(得分:0)

您是否尝试使用telnet模拟机器人的行为并查看会发生什么?连接,键入(或复制 - 粘贴)您的机器人输出的内容,然后盯着屏幕几分钟。

答案 5 :(得分:0)

this

代码有一个完美的工作IRC服务器。我会走这条路。

PS:如果你不喜欢它,那就好,不要把它弄坏。感谢

答案 6 :(得分:-1)

听起来你因为没有设置IDENT而被阻止。

Listen在端口113上查看是否有来自IRC服务器的Ident请求。

同样this is a good read for how Mirc handles ident requests这样你就可以轻松鞭打一些东西以使其发挥作用。

答案 7 :(得分:-1)

Telnet表示它应该以malvager.com,6667端口

的方式编写
"PASS *\n"
"NICK OrgyBot|" . rand() . "\n"
"USER Orgy orgy.test hfcoder :twBooter\n"


if($exData[0] == "PING :hub.malvager.com")
{ 
 fwrite($ircSocket, "PONG :hub.malvager.com".$exData[1]."\n"); 
} 

答案 8 :(得分:-1)

您是从本地计算机还是网络服务器运行此bot?如果它来自您的网络服务器,那么malvager.com可能会阻止您的网络服务器,而其他irc服务器则会将其解除阻止。

我在其他IRC网络上遇到过这个问题,事实证明,其他人使用了我用来托管僵尸网络的托管服务提供商,这需要IRC服务器阻止来自我主机的IP。

如果您要连接的IP地址被阻止,我会问malvager.com管理员。

同时尝试$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS, 30);

编辑:

我使用bluehost,看起来你也一样。我的irc在他们的服务器上工作时遇到了问题,我在Live Chat中与他们交谈过。他们提到他们不允许在他们的网络上使用irc机器人,因此他们阻止了大部分网络。他们提到,如果一个人滑倒并且他们抓住了,他们将暂停你的帐户。

答案 9 :(得分:-1)

1)如果服务器发送带有消息的ping,您应该使用pong回复,然后回复相同的消息 2)不时(每30秒左右)向服务器发送ping消息。如果您在几分钟内没有收到回复,您可能会认为客户端已从服务器超时并应重新连接。

答案 10 :(得分:-1)

我记得在mIRC时代做过一些机器人。 问题始终是我以前的换行符 发送消息后发送。

据我记忆,这些人都是#30和#32等。 为什么不试试它们而不是\ n。有些服务器很漂亮 对这个问题很敏感。

此外,乒乓球必须以文字回复 ping,这非常重要。

玩得开心!

答案 11 :(得分:-1)

bluehost.com托管阻止 IRC 与此 IRC服务器的连接,这是检查信息。