0

更改: 我已确定问题与编码无关。但是问题仍然存在,因为这似乎是由 IRC 引起的,我仍在寻找原因。

我正在连接的服务器使用两种 PING 请求:

连接到服务器时询问一个,它的格式为 8 个字符的字母数字值。

例子:PING :EA0E9275.

另一种是在服务器发出 MOTD 后,加入频道,完成“/NAMES 列表结束”。然后在“n 延迟”之后,服务器向我发送一个以当前连接主机为值的 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/USER 信息...
    • 服务器收到 NICK/USER 信息,等待字母数字 PING 回复...
      • 服务器收到字母数字 PING 回复,发送 MOTD。
      • MOTD结束,发送JOIN加入频道...
      • 已加入频道,已请求频道的名称列表。
      • NAMES 列表结束。
    • 接收活动通道/服务器数据。
      • 如果发送 QUIT 命令,服务器将忽略通常的 QUIT,服务器默认发送“Closing Link”作为状态退出(生命太短...)。
    • 服务器正在进行活动检查,收到主机 PING(irc.ams.nl.euirc.net),服务器正在等待回复...
      • 向服务器发送回复。
      • 如果发送 QUIT 命令,服务器将按用户级别处理 QUIT 命令,通常方式,并通过用户指定的消息或空发送“关闭链接”。((QUIT:用户消息)或(QUIT:))
4

1 回答 1

0

让我们回顾一下您的代码:

  1. 当我制作我的 IRC 机器人时,我explode()将来自服务器的字符串编辑为单词(按空格分隔),然后您可以参考单词:

    if ($words[0] == "PING") { reply("PONG :" . $words[1]); }
    
  2. 总是PONG紧随其后PING,并回复与服务器相同的消息。

如果满足了第二个,那么您将永远不会遇到服务器等待 PING 的问题,因为您会立即回答。客户端应该遵守来自服务器的 PING PONG 命令,否则服务器会认为它是离线的(是的,即使您发送其他任何内容,服务器也需要 PONG)。

于 2012-11-21T17:28:29.537 回答