【问题标题】:Implementing IRC RFC: How to respond to MODE?实施 IRC RFC:如何响应 MODE?
【发布时间】:2012-10-14 21:12:37
【问题描述】:

我正在尝试编写自己的 IRC 服务器。我正在引用 IRC RFC,但这对我来说有点困惑。如果我严格遵守 RFC,我认为任何流行的客户端都不会与我的服务器一起使用,比如 mIRC。例如,RFC 说服务器应该对成功的 MODE 命令响应以下数字响应之一:RPL_BANLISTRPL_CHANNELMODEISRPL_ENDOFBANLISTRPL_UMODEIS。这会让我相信,在成功更改用户模式时,我会使用 RPL_UMODEIS 进行响应,尽管 RFC 似乎没有明确说明。

但是,当我检查另一个开源 IRC 服务器的源代码时,我看到它以“MODE”的非数字命令进行响应。它只是回显它看起来像的 MODE 命令。

你应该如何响应 MODE 命令?有没有更好的格式的 RFC,它有一个简单的命令和响应图表,或者什么?

【问题讨论】:

    标签: irc


    【解决方案1】:

    RFC 1459 以稀疏着称。它并没有告诉你编写服务器需要知道的一切。

    在这种情况下,缺少的是查询现有模式的MODE 命令和设置新模式的MODE 命令之间的区别。在模式查询的情况下,客户端将收到指示现有模式的数字回复;在更改模式的情况下,除非出现错误,否则客户端将不会收到直接的数字回复。但是,如果模式成功更改,那么客户端将从服务器收到MODE,通知它更改。

    例如,如果客户的昵称是foo,它会发送:

    MODE foo
    

    然后这是查询其当前用户模式 ​​- 它会期待 RPL_UMODEIS 回复,如:

    :irc.example.org 221 foo :+i
    

    如果客户端随后发送:

    MODE foo :+w
    

    那么这就是改变它的用户模式——它会得到一个像ERR_USERSDONTMATCH这样的数字错误或模式改变的确认:

    :foo!foo@bar.com MODE foo :+w
    

    请注意,从技术上讲,此确认并不是对MODE 的直接回复——它是服务器通知客户端其状态的相关更改,而这恰好是由客户端命令触发的。

    通道模式也存在类似情况。如果客户端通过以下方式查询当前通道模式:

    MODE #channel
    

    然后它会期待一个包含当前“简单”通道模式的RPL_CHANNELMODEIS 响应,并且可能还有一个RPL_CREATIONTIMEresponse 给出通道创建时间。如果它使用以下命令查询当前的禁止列表:

    MODE #channel b
    

    然后应该得到零个或多个RPL_BANLIST 响应,然后是RPL_ENDOFBANLIST

    如果客户端尝试更改频道模式:

    MODE #channel :+k zounds
    

    那么直接回复要么是错误回复要么什么都没有;如果频道模式实际改变了,它会看到MODE 命令回显。在后一种情况下,成功的MODE 命令也将发送给频道的其他成员——这有助于说明它并不是对初始MODE 命令的真正直接回复,而是对它的间接响应。

    【讨论】:

    • 我从哪里获得构建合适的 IRC 服务器的必要信息?你是怎么学的?
    • IRC 更多是通过部落知识和习惯定义的,获得必要信息的最佳位置是调查相当标准的服务器(例如 ircd-hybrid、ircd-ratbox、ircu、虚幻)在做什么同样的情况。
    【解决方案2】:

    它应该是用户模式字符串。通常的响应是:

    • 对于 +/- b 模式:RPL_BANLIST 和/或禁止列表,然后是 RPL_ENDOFBANLIST
    • 频道模式:RPL_CHANNELMODEIS
    • 用于rmodes:RPL_UMODEIS

    有时发出 MODE 命令不是为了更改模式而是列出它(例如不带任何参数的 +b)。因此,作为回应,您可以给出适当的数字代码,然后将模式吐回。在RFC 2812 update to RFC 1459 中有更多关于从服务器返回的信息,它更多地关注客户端。

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 2012-08-10
      • 2016-10-04
      • 2017-01-24
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2020-06-20
      相关资源
      最近更新 更多