Sockets PHP-IRC“;“退出”;工作不正常
更改: 我已经确定问题与编码无关。然而问题仍然存在,因为这似乎是由IRC引起的,我仍在寻找原因 我连接的服务器使用两种PING请求: 一个在连接到服务器时被询问,它的格式是8个字符的字母数字值 示例:Sockets PHP-IRC“;“退出”;工作不正常,sockets,irc,Sockets,Irc,更改: 我已经确定问题与编码无关。然而问题仍然存在,因为这似乎是由IRC引起的,我仍在寻找原因 我连接的服务器使用两种PING请求: 一个在连接到服务器时被询问,它的格式是8个字符的字母数字值 示例:PING:EA0E9275。 另一个是服务器发出MOTD后,加入通道,完成“结束/名称列表”。然后,在“n延迟”之后,服务器以当前连接的主机作为其值向我发送ping请求 示例:PING:irc.ams.nl.euirc.net 如果我在回复主机PING请求之前发送命令“QUIT:QUIT Messa
PING:EA0E9275。
另一个是服务器发出MOTD后,加入通道,完成“结束/名称列表”。然后,在“n延迟”之后,服务器以当前连接的主机作为其值向我发送ping请求
示例:PING:irc.ams.nl.euirc.net
如果我在回复主机PING请求之前发送命令“QUIT:QUIT Message”,服务器将忽略QUIT消息,而是使用与“Client Exited”消息类似的服务器填充状态消息退出
示例:错误:关闭链接:Nick[IP.ADD.RE.SS](生命太短…
但是,如果我在响应主机PING请求后发送相同的命令,我的QUIT将得到应有的处理
示例:错误:关闭链接:Nick[IP.ADD.RE.SS](退出:退出消息)
我已在RFC中进行了检查,并在“退出”部分中找到以下内容:
如果由于某些其他原因,客户端连接在客户端未发出QUIT命令的情况下关闭(例如,客户端死亡,套接字上发生EOF),则服务器需要使用某种类型的消息填充QUIT消息,以反映导致其发生的事件的性质
另外,如果仍然需要查看我用来完成此任务的部分代码。然而,这是IRC客户端mIRC的一个常见问题
基本方案
- 正在连接到服务器。。。
- 连接李>
- 服务器/用户信息
- 服务器收到尼克/用户信息,正在等待字母数字PING回复。。。
- 服务器收到字母数字PING回复,正在发送MOTD
- MOTD结束,正在向加入频道发送加入
- 已加入频道,已请求频道的名称列表
- 姓名列表结束
- 正在接收活动通道/服务器数据。
- 如果发送QUIT命令,服务器将忽略通常的QUIT,并在服务器默认情况下发送“Closing Link”作为status QUIT(生命太短…)
- 服务器正在执行活动检查,收到主机PING(irc.ams.nl.euirc.net),服务器正在等待答复。。。
- 已向服务器发送答复
- 如果发送了QUIT命令,服务器将以用户级别处理QUIT命令,通常的方式,并通过用户指定的消息或空消息发送“关闭链接”。((QUIT:user message)或(QUIT:)
explode()
将服务器中的字符串分解为单词(按空格分割),然后您可以引用单词:
if ($words[0] == "PING") { reply("PONG :" . $words[1]); }
PING
之后立即进行PONG
,并使用与服务器相同的消息进行回复如果完成了第二步,您就永远不会遇到服务器等待PING的问题,因为您将立即回答。客户机应遵守服务器发出的乒乓球命令,否则服务器会认为它处于脱机状态(是的,即使您发送其他内容,服务器也会收到乒乓球)。我给出的代码示例过于简化,考虑到我的示例,它只会使事情变得复杂,因此我将其作为参考。这也发生在任何客户端上。第二,我想我被误解了。我试图完成的是发出一个退出消息,但这不会发生,直到服务器在连接后向我发送第一个活动检查,并且在我响应后,一切都正常。是的,我的代码仍然会对PING请求做出即时响应,我没有断开连接的问题。等等,所以你试图在服务器发送给你的第一次PING之前退出,但它不允许你?用基本方案更新了问题,这太多了,无法用语言解释。@TheDeadLike:坏的“关闭链接”是否存在是否在发送退出请求后立即发生?还是服务器只是忽略了它,并在一段时间后自行发送死亡消息?@TheDeadLike:听起来IRC服务器有问题。我无法在本地主机上复制它。