8

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

ネットキャット:

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

4

12 に答える 12

2

いくつかのエラーがあります。

最初の爆発結果を厳密にチェックするため、スペース文字で爆発し、IRC実装プロトコルではすべてのコマンドを改行文字で終了する必要があり、サーバーが送信し"PING\n"ないため"PING"$exDataアレイはこの状態になります。

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

と等しくないため、あなた$exData[0] == "PING" は偽です。良い解決策は、改行マーカーだけではないため、パーサーのコマンドの最後に追加しないことです(IRCプロトコルの実装が不十分な場合は、これをお勧めします。IRCプロトコル開発者が使用する改行マーカーがわからない場合は、Delphi INDY Buggy IRC Server Controlについて考えてください)、より良い解決策は、彼女をチェックしないことです。"PING""PING\n""\n""\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)),を に変更しwhile ($data = fgets($ircSocket))ます。サーバー名が長いと、単純に 128 バイトをオーバーフローする可能性があるためです。


そして、fwrite($ircSocket, "JOIN " . $ircChannel . "\n");あなたのJOINコマンドはUSERandNICKコマンドの後に送信され、ユーザーが登録される前にサーバーがリクエストを解析し、ユーザーが登録されていない場合はチャネリングできるJOINため、IRCサーバーは失敗したコマンドをキューに入れません。これは意味がありません。これのベスト プラクティスは、コマンドがサーバーから受信されたJOIN後にコマンドを送信することです。MOTDAUTOJOIN

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

スクリプトの設計については、単純なボットを作成する場合は、このトピックで何も言うことはありませんが、大きなコードを作成する予定がある場合は、別の方法でスクリプトを設計する必要があります。IRC プロトコルの実装や IRC ボット アクションなどのいくつかのレイヤーを分離する必要があります。何らかのクラスを使用して、IRC プロトコルの責任を彼女に移す必要があります。これは、IRC プロトコル制御とボット アクション コードを混在させる大きなコード部分では、技術的負債が大きくなるためです。

于 2010-09-21T11:59:05.997 に答える
1
  1. インストールnetcat
  2. 同じデバイスで実行nc hub.malvager.com 6667
  3. 結果を分析します。

結果が次の場合:

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. php.netPHPから SOURCE FILES から新しいバージョンをインストールします (apt のバイナリ バージョンまたは何かのバージョンが非推奨になっているため、これは重要です)。
  2. 次に、問題がまだ解決していない場合は、デフォルトのPHP.iniファイルを変更して設定を調整できます(デフォルトのファイルを使用すると、スクリプトはうまく機能すると思います)。fsockopen.ini

結果が何らかの接続エラーを表している場合、次の例のように考える人もいます:

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. この結果を単独で分析したい場合は、このコマンドの結果が便利なので、これを投稿します。

の結果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

POSIXtracert 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
于 2010-09-22T16:15:22.067 に答える
0

ボットの動作をシミュレートし、何が起こるかを確認するために telnet を使用してみましたか? 接続し、ボットが出力するものを正確に入力 (またはコピーして貼り付け) し、画面を数分間見つめます。

于 2010-09-29T13:02:43.120 に答える
0

これ

コードには完全に機能する IRC サーバーがあります。私はこの道を行きます。

PS: 気に入らない場合は、気をつけて書き留めないでください。ありがとう

于 2010-10-14T17:34:56.647 に答える
0

サーバーは ident 応答を必要とする場合があります。また、そのスクリプトを実行したところ、問題なく接続されました。たぶん、ファイアウォールの問題です。

于 2010-09-16T15:33:51.130 に答える
-1

IDENTが設定されていないため、ブロックされているようです。

ポート113でリッスンして、IRCサーバーからのIdent要求があるかどうかを確認します。

また、これは、MircがIDリクエストを処理する方法をよく読んでいるので、何かを簡単に作成して機能させることができます。

于 2010-09-22T03:15:25.390 に答える
-1

rfc1459 に従った IRC プロトコルのメッセージの終わりは、単なる ¨\n¨ ではなく ¨\r\n¨ です。そのため、一部のサーバー実装はメッセージを拒否する場合があります。

于 2010-09-27T20:50:35.243 に答える
-1

1) サーバーがメッセージ付きの ping を送信した場合は、同じメッセージが続く pong で応答する必要があります。
2) ときどき (約 30 秒ごとに) ping メッセージをサーバーに送信します。数分以内に応答がない場合は、クライアントがサーバーからタイムアウトしたため、再接続する必要があると考えることができます。

于 2010-09-27T20:38:05.703 に答える
-1

このボットをローカル マシンまたは Web サーバーから実行していますか? あなたのウェブサーバーからのものである場合、malvager.com があなたのウェブサーバーをブロックし、他の irc サーバーがブロックを解除している可能性があります。

私は他のIRCネットワークでこの問題を抱えていました.IRCサーバーが私のホストからIPをブロックする必要があるボットネットをホストするために私が使用するのと同じホスティングプロバイダーを他の人が使用していることが判明しました.

接続元の IP アドレスがブロックされているかどうか、malvager.com の管理者に問い合わせます。

また、試してみてください$ircSocket = fsockopen($ircServer, $ircPort, $eN, $eS, 30);

編集:

私はbluehostを使用していますが、あなたもそうしているようです。彼らのサーバーで動作する IRC に問題があり、ライブ チャットで彼らと話しました。彼らは、ネットワーク上で IRC ボットを許可していないため、ほとんどのネットワークをブロックしていると述べています。彼らは、しかし、誰かがすり抜けてそれを捕まえると、あなたのアカウントを停止すると言いました.

于 2010-09-27T16:55:07.780 に答える
-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"); 
} 
于 2010-09-26T08:54:34.247 に答える
-1

bluehost.comホスティングがこのIRC サーバーへのIRC接続をブロックしている場合、これはチェック済みの情報です。

于 2010-10-03T19:23:44.820 に答える
-1

mIRC 時代にいくつかのボットを作成したことを覚えています。問題は常に、メッセージの後に送信していた改行でした。

私が覚えている限り、文字は #30 や #32 などです。\n の代わりに試してみませんか。一部のサーバーは、この問題に非常に敏感です。

また、Pong には、Ping の後にテキストを返信する必要があります。これは非常に重要です。

楽しむ!

于 2010-10-03T12:38:41.217 に答える