PHP - IRC“退出”无法正常工作

时间:2012-11-21 03:47:49

标签: sockets irc

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

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

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

示例:PING :EA0E9275.

另一个是在服务器发出MOTD,加入频道后,完成“End of / NAMES list”。然后在“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),则服务器需要填写某种类型的退出消息反映导致其发生的事件性质的信息。

此外,如果仍然需要查看我正在使用的部分代码来完成此任务,you can check it here。但是,这是mIRC IRC客户端的常见问题。

基本方案

  • 连接服务器...
    • 连接<!/ LI>
    • 服务器等待NICK / USER信息...
    • 服务器收到NICK / USER信息,等待字母数字PING回复...
      • 服务器收到字母数字PING回复,发送MOTD。
      • MOTD结束,发送JOIN加入频道......
      • 加入频道,已请求NAMES频道列表。
      • NAMES清单结束。
    • 接收活动频道/服务器数据。
      • 如果发送QUIT命令,服务器将忽略通常的QUIT,并将服务器默认发送“Closing Link”作为状态退出(生命太短......)。
    • 服务器正在进行活动检查,收到主机PING(irc.ams.nl.euirc.net),服务器正在等待回复...
      • 向服务器发送回复。
      • 如果发送了QUIT命令,服务器将以通常的方式处理用户级的QUIT命令,并将通过用户指定的消息发送“Closing Link”或为空。((QUIT:User Message)或(QUIT :))

1 个答案:

答案 0 :(得分:0)

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

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

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

  3. 如果满足第二个,你应该永远不会遇到服务器等待PING的问题,因为你会立即回答。客户端应该尊重服务器上的PING PONG命令,否则服务器会将其视为脱机(是的,即使您发送了其他任何内容,服务器也希望PONG)。