试图编写IRC客户端,但努力寻找有关代码和连接协议的良好资源

我看过RFC,但我仍在苦苦挣扎。 我在C#中编写了一个基本客户端,但是找不到正确连接的文档。

一旦我连接并传输NICK和USER信息,我就需要加入一个频道。 如果我马上加入,没有任何反应 – 大概是因为它太快了。 我必须推迟它,但我不知道我需要等待哪个命令才能知道它可以继续。

我得到的东西:

:irc.fish.net注意AUTH:查找您的主机名…

:irc.fish.net 001 FishBot:欢迎

以及代码002,003,005,251,252等的东西,但我找不到网上的任何地方,告诉我这些是什么。

所以我的基本2个问题是:你发送了什么JOIN作为回应,我在哪里可以找到上面的IRC代码对应的内容? RFC文档没用!

RFC文档肯定没用! 您是正确的,您需要发送USER然后发送NICK 。 您收到的NOTICE是IRC服务器正在尝试通过名为IDENTD的协议连接回您的PC。 这是一个相对简单的协议,但它的结果是它想知道连接到服务器的主机上的程序正在使用服务器具有的本地/远程端口。

有可能,您的防火墙正在阻止这种情况(您可能没有运行IDENTD服务器)。 这不是一个大问题,尽管一个成熟的IRC客户端将实现它。 你可以在这里找到更多。 这更详细。 实施起来相对简单。

大多数IRC服务器都会放弃,如果它无法连接到你,我已经忘记了它的确切副作用(它已经有一段时间了),但你想要注意的下一条消息是MOTD_START / MOTD / MOTD_END和ERR_NOMOTD。 只有收到当天消息的结尾或处理了ERR_NOMOTD(没有一个)之后,才能使用JOIN加入频道。

顺便提一下,这是一个很好的RegEx,用于匹配来自IRC服务器的输入:

 ^(?:[:@]([^\\s]+) )?([^\\s]+)(?: ((?:[^:\\s][^\\s]* ?)*))?(?: ?:(.*))?$ 

IRC RFC列出了所有可能的代码及其含义。 我不确定你为什么认为它们没用。 你引用了哪些?

编辑

我查找了用于IRC的旧C ++代码,因此我可以提供更多帮助。 连接后,它进入一个阶段(我已经标记)谈判:

谈判阶段:

  1. 如果已为服务器指定了密码,请将其发送给PASS mypassword
  2. 发送USER命令。
  3. 输入Negotiate Nickname Stage
  4. 等待ERR_NOMOTDEND_OFMOTD 。 直到其中一个出现,你才“正式联系”。

谈判昵称阶段:

完全可能在连接期间,您要使用的昵称已被使用。 因此,客户应该:

  1. 发出NICK命令
  2. 如果收到ERR_NICKINUSE响应,请再次发出。 如果您没有更多的昵称可供使用,您可以拯救或提示用户另一个昵称。

还有一些需要考虑的事情:

  • 查看我们的PING命令。 当您闲置时,服务器将发送此信息。 将此处理为高优先级,并使用服务器提供的数据返回PONG 。 如果不这样做将确保您断开连接,当您测试IRC客户端时,这可能是后端的痛苦。

奖金乐趣

这是我对IRC命令的枚举,你应该能够很容易地把它放到C#中:

  // reply ids enum Reply { RplNone = 0, // Initial RplWelcome = 001, // :Welcome to the Internet Relay Network  RplYourHost = 002, // :Your host is , running version  RplCreated = 003, // :This server was created  RplMyInfo = 004, //     RplMap = 005, // :map RplEndOfMap = 007, // :End of /MAP RplMotdStart = 375, // :- server Message of the Day RplMotd = 372, // :-  RplMotdAlt = 377, // :-  (some) RplMotdAlt2 = 378, // :-  (some) RplMotdEnd = 376, // :End of /MOTD command. RplUModeIs = 221, //  // IsOn/UserHost RplUserHost = 302, // :userhosts RplIsOn = 303, // :nicknames // Away RplAway = 301, //  :away RplUnAway = 305, // :You are no longer marked as being away RplNowAway = 306, // :You have been marked as being away // WHOIS/WHOWAS RplWhoisHelper = 310, //  :looks very helpful DALNET RplWhoIsUser = 311, //   
* : RplWhoIsServer = 312, // : RplWhoIsOperator = 313, // :is an IRC Operator RplWhoIsIdle = 317, // : RplEndOfWhois = 318, // :End of /WHOIS list. RplWhoIsChannels = 319, // : RplWhoWasUser = 314, //
* : RplEndOfWhoWas = 369, // :End of WHOWAS RplWhoReply = 352, //
: RplEndOfWho = 315, // :End of /WHO list. RplUserIPs = 307, // :userips UNDERNET RplUserIP = 340, // :=+@ UNDERNET // List RplListStart = 321, // Channel :Users Name RplList = 322, // : RplListEnd = 323, // :End of /LIST RplLinks = 364, // : RplEndOfLinks = 365, // :End of /LINKS list. // Post-Channel Join RplUniqOpIs = 325, RplChannelModeIs = 324, // RplChannelUrl = 328, // :url DALNET RplChannelCreated = 329, //

也许您查看旧版本( RFC 1459 )而不是标准的当前版本( RFC 2812 )?

后者列出了第5节“回复”中的数字代码:

  001 RPL_WELCOME "Welcome to the Internet Relay Network !@" 002 RPL_YOURHOST "Your host is , running version " 003 RPL_CREATED "This server was created " ... 

(这应该回答你的第二个问题;不幸的是,我对协议的解释不够熟悉。一个简单的解决方案可以让你走上正确的轨道,可能是使用一些数据包嗅探器跟踪现有IRC客户端的连接。 )

代码可以在本文档中找到,您指定的代码是:

  • 002 RPL_YOURHOST“您的主机正在运行版本”
  • 003 RPL_CREATED“此服务器已创建”
  • 005 RPL_BOUNCE“试用服务器,端口”
  • 251 RPL_LUSERCLIENT“:服务器上有用户和服务”
  • 252 RPL_LUSEROP“:运营商在线”