gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:40:02 26 4
gpt4 key购买 nike

我正在尝试将我的 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:连接到 hub.malvager.com 端口 6667 (tcp) 失败:连接超时

最佳答案

您有一些错误。

是错误的,因为首先严格检查爆炸结果,你通过空格字符爆炸并且在IRC实现协议(protocol)中所有命令必须以换行符终止然后服务器发送给你“PING\n " 不是 "PING" 那么您的 $exData 数组就处于这种状态。

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

那么你的 $exData[0] == "PING" 是 false 因为 "PING" 不等于 "PING\n”。好的解决方案是不将 "\n" 添加到解析器中的命令末尾,因为 "\n" 不仅是换行符(对于糟糕的 IRC 协议(protocol)实现,我建议这样做,你永远不知道 IRC 协议(protocol)开发人员可能使用什么换行标记,想想 Delphi INDY Buggy IRC Server Control),更好的解决方案是不检查她。

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)) 更改为 while ($data = fgets($ircSocket)),因为在长服务器名称中,您可以简单地溢出 128 个字节。


而你的 fwrite($ircSocket, "JOIN ". $ircChannel . "\n"); 行并没有完全按照你的意愿行事,因为你的 JOIN命令在 USERNICK 命令之后发送,然后服务器在用户注册之前解析您的请求,如果用户未注册,您可以JOIN 到 channel ,IRC 服务器不会 QUEUE 失败的命令,因为这没有任何意义。最好的做法是在从服务器接收到 MOTD 命令之后发送 JOIN 命令,如果你想实现一些功能,比如 自动加入

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

关于您的脚本设计,如果您编写的是简单的机器人,那么我在本主题中无话可说,但如果您打算编写一些大段代码,则应该以其他方式设计您的脚本。您必须分离一些层,例如 IRC 协议(protocol)实现和您的 IRC 机器人操作。您应该使用一些类将 IRC 协议(protocol)的责任转移到她身上,因为在更大的代码段中,将 IRC 协议(protocol)控制与您的机器人操作代码混合是很好的技术债务

关于php - 使用 PHP 连接到 IRC 服务器时连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3727431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com