3

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

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

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

4

2 回答 2

5

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_CREATIONTIME响应,并且可能是一个给出通道创建时间的响应。如果它使用以下命令查询当前的禁止列表:

MODE #channel b

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

相反,如果客户端尝试更改通道模式:

MODE #channel :+k zounds

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

于 2012-10-15T14:08:32.407 回答
1

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

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

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

于 2012-10-15T03:22:50.093 回答