Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets PHP-IRC“;“退出”;工作不正常_Sockets_Irc - Fatal编程技术网

Sockets PHP-IRC“;“退出”;工作不正常

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

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

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

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

示例:
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:)

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

  • 当我制作IRC bot时,我
    explode()
    将服务器中的字符串分解为单词(按空格分割),然后您可以引用单词:

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


  • 如果完成了第二步,您就永远不会遇到服务器等待PING的问题,因为您将立即回答。客户机应遵守服务器发出的乒乓球命令,否则服务器会认为它处于脱机状态(是的,即使您发送其他内容,服务器也会收到乒乓球)。

    我给出的代码示例过于简化,考虑到我的示例,它只会使事情变得复杂,因此我将其作为参考。这也发生在任何客户端上。第二,我想我被误解了。我试图完成的是发出一个退出消息,但这不会发生,直到服务器在连接后向我发送第一个活动检查,并且在我响应后,一切都正常。是的,我的代码仍然会对PING请求做出即时响应,我没有断开连接的问题。等等,所以你试图在服务器发送给你的第一次PING之前退出,但它不允许你?用基本方案更新了问题,这太多了,无法用语言解释。@TheDeadLike:坏的“关闭链接”是否存在是否在发送退出请求后立即发生?还是服务器只是忽略了它,并在一段时间后自行发送死亡消息?@TheDeadLike:听起来IRC服务器有问题。我无法在本地主机上复制它。