关于套接字:PHP – IRC“QUIT”无法正常工作

PHP - IRC “QUIT” not working properly

变化:我已经确定问题与编码无关。然而问题仍然存在,因为这似乎是由IRC造成的,我仍在寻找原因。

我连接的服务器使用两种ping请求:

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

示例:PING :EA0E9275.

另一个是在服务器发出MOTD后,加入通道,完成"结束/名称列表"。然后在"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请求后发送相同的命令,我的退出将得到它应该的处理。

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

我已经签入了RFC,并在退出部分找到了它:

如果由于其他原因,客户机连接在没有发出退出命令的情况下关闭(例如,客户机死亡,并且EOF发生在套接字上),服务器需要用反映导致事件发生的事件性质的某种消息填充退出消息。

另外,如果仍然需要看到我用来完成这项工作的部分代码,可以在这里检查它。然而,这是IRC客户机MIRC的一个常见问题。

基本方案

  • 正在连接到服务器…
    • 有联系的!
    • 服务器正在等待尼克/用户信息…
    • 服务器接收到nick/user信息,正在等待字母数字ping回复…
      • 服务器接收到字母数字ping回复,发送MOTD。
      • MOTD结束,正在发送join以加入频道…
      • 加入频道后,已请求频道的名称列表。
      • 姓名列表结束。
    • 接收活动通道/服务器数据。
      • 如果发送了quit命令,服务器将忽略通常的quit,并将按服务器默认发送"关闭链接"作为状态quit(寿命太短…)。
    • 服务器正在执行活动检查,接收到主机ping(irc.ams.nl.euirc.net),服务器正在等待答复…
      • 已向服务器发送答复。
      • 如果发送了quit命令,服务器将按照通常的方式以用户级别处理quit命令,并按用户指定的消息或空消息发送"关闭链接"。(quit:用户消息)或(quit:)

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

  • 当我创建IRC bot时,我将字符串从服务器转换为单词(按空格拆分),然后可以引用单词:

    1
    if ($words[0] =="PING") { reply("PONG :" . $words[1]); }
  • 总是在PING之后立即执行PONG,并使用与服务器相同的消息进行回复。

  • 如果满足了第二个条件,就不应该让服务器等待ping,因为您将立即回答这个问题。客户机应该遵守服务器发出的ping-pong命令,否则服务器会认为它是脱机的(是的,即使您发送了任何其他命令,服务器也会认为pong)。