0

変更: 問題はコーディングとは何の関係もないと判断しました。ただし、IRC が原因であると思われるため、問題は解決していません。現在も原因を調査中です。

接続しているサーバーは、次の 2 種類の PING 要求を使用します。

1 つはサーバーへの接続時に尋ねられ、8 文字の英数字の値の形式です。

例:PING :EA0E9275.

もう 1 つは、サーバーが MOTD を送信し、チャネルに参加し、「/NAMES リストの終わり」を完了した後です。次に、「n delay」後、サーバーは現在接続されているホストを値として ping 要求を送信します。

例:PING :irc.ams.nl.euirc.net

ホストの PING 要求に応答する前に「QUIT :Quit Message」コマンドを送信すると、サーバーは QUIT メッセージを無視し、代わりに、「Client Exited」メッセージに似たサーバー入力のステータス メッセージで終了します。

例:ERROR :Closing Link: Nick[IP.ADD.RE.SS] (Life is too short...)

ただし、ホストの PING 要求に応答した後に同じコマンドを送信すると、QUIT が正常に処理されます。

例:ERROR :Closing Link: Nick[IP.ADD.RE.SS] (Quit: Quit Message)

RFC をチェックインしたところ、QUIT セクションでこれが見つかりました。

何らかの理由で、クライアントが QUIT コマンドを発行せずにクライアント接続が閉じられた場合 (たとえば、クライアントが終了し、ソケットで EOF が発生した場合)、サーバーは終了メッセージに、接続の性質を反映した何らかのメッセージを入力する必要があります。それを引き起こした出来事。

また、これを達成するために使用している部分的なコードをまだ確認する必要がある場合は、ここで確認できます。ただし、これは IRC クライアントである mIRC に共通の問題です。

基本スキーム

  • サーバーにつなげる...
    • つながった!
    • サーバー待機 NICK/ユーザー情報...
    • サーバーは NICK/USER 情報を受信しました。英数字の PING 応答を待っています...
      • サーバーは英数字の PING 応答を受信し、MOTD を送信しました。
      • MOTD の終了、チャネルに参加するために JOIN を送信しています...
      • チャンネルに参加しました。チャンネルの NAMES リストがリクエストされました。
      • NAMES リストの終わり。
    • アクティブなチャネル/サーバー データを受信して​​います。
      • QUIT コマンドが送信された場合、サーバーは通常の QUIT を無視し、サーバーのデフォルトではステータス quit(Life is too short...) として「Closing Link」を送信します。
    • サーバーはアライブチェックを行っており、ホスト PING (irc.ams.nl.euirc.net) を受信し、サーバーは応答を待っています...
      • サーバーに返信を送信しました。
      • QUIT コマンドが送信された場合、サーバーは QUIT コマンドを通常の方法でユーザーレベルで処理し、ユーザー指定のメッセージまたは空のメッセージで「リンクを閉じる」を送信します ((QUIT: User Message) または (QUIT: ))
4

1 に答える 1

0

コードを少し見直してみましょう。

  1. IRC ボットを作成したときexplode()、サーバーからの文字列を単語に編集しました (スペースで分割)。その後、単語を参照できます。

    if ($words[0] == "PING") { reply("PONG :" . $words[1]); }
    
  2. 常にのPONG直後にPING、サーバーと同じメッセージで応答します。

2 番目の要件が満たされている場合は、サーバーが PING を待機するという問題が発生することはありません。これは、すぐに応答するためです。クライアントはサーバーからの PING PONG コマンドを受け入れることが期待されます。そうしないと、サーバーはそれをオフラインと見なします (そうです、他のものを送信したとしても、サーバーは PONG を期待します)。

于 2012-11-21T17:28:29.537 に答える