尝试编写 IRC 客户端,但很难找到有关代码和连接协议的优质资源

发布于 2024-12-21 05:30:58 字数 433 浏览 3 评论 0原文

我已经看过 RFC 但我仍然在挣扎。我已经用 C# 编写了一个基本客户端,但找不到有关如何正确连接的文档。

一旦我连接并传输NICK和USER信息,我就需要加入一个频道。如果我立即执行 JOIN,则不会发生任何事情 - 大概是因为太早了。我必须推迟它,但我不知道我需要等待哪个命令才能知道可以继续。

我收到类似以下内容:

:irc.fish.net NOTICE AUTH :Looking up your hostname...

:irc.fish.net 001 FishBot :Welcome

以及带有代码 002、003、005、251、252 等的内容。但我在网上找不到任何地方可以告诉我这些是什么。

所以我的两个基本问题是:您发送 JOIN 来响应什么?我在哪里可以找到上面的 IRC 代码对应的内容? RFC文档没用!

I've looked at the RFC but I am still struggling. I've written a basic client in C# but I cannot find documentation for how to connect properly.

Once I connect and transmit NICK and USER information, I need to join a channel. If I do a JOIN straight away, nothing happens - presumably because it's too soon. I have to delay it, but I don't know which command I need to wait for to know it's okay to go ahead.

I get stuff like:

:irc.fish.net NOTICE AUTH :looking up your hostname...

and

:irc.fish.net 001 FishBot :Welcome

as well as stuff with codes 002, 003, 005, 251, 252, etc. but I can't find anywhere online that shows me what these are.

So my basic 2 questions are: What do you send a JOIN in response to, and where can I find what the IRC codes above correspond to? The RFC document was useless!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

总以为 2024-12-28 05:30:59

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

很可能,您的防火墙阻止了这种情况(并且您可能没有运行 IDENTD 服务器)。这不是一个大问题,尽管成熟的 IRC 客户端会实现它。您可以在此处了解更多信息。这涉及到更多细节。实施起来相对简单。

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

顺便说一句,这是一个很好的正则表达式,用于匹配来自 IRC 服务器的输入:

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

IRC RFC 列出了所有可能的代码及其含义。我不知道为什么你认为它们毫无用处。您参考了哪些?

编辑

我查找了 IRC 的旧 C++ 代码,这样我可以提供更多帮助。连接后,它进入协商阶段(我已标记):

协商阶段:

  1. 如果已为服务器指定了密码,请发送PASS mypassword
  2. 发送 USER 命令。
  3. 进入协商昵称阶段
  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 <nickname>
        RplYourHost         = 002,                  // :Your host is <server>, running version <ver>
        RplCreated          = 003,                  // :This server was created <datetime>
        RplMyInfo           = 004,                  // <server> <ver> <usermode> <chanmode>
        RplMap              = 005,                  // :map
        RplEndOfMap         = 007,                  // :End of /MAP
        RplMotdStart        = 375,                  // :- server Message of the Day
        RplMotd             = 372,                  // :- <info>
        RplMotdAlt          = 377,                  // :- <info>                                                                        (some)
        RplMotdAlt2         = 378,                  // :- <info>                                                                        (some)
        RplMotdEnd          = 376,                  // :End of /MOTD command.
        RplUModeIs          = 221,                  // <mode>

        // IsOn/UserHost
        RplUserHost         = 302,                  // :userhosts
        RplIsOn             = 303,                  // :nicknames

        // Away
        RplAway             = 301,                  // <nick> :away
        RplUnAway           = 305,                  // :You are no longer marked as being away
        RplNowAway          = 306,                  // :You have been marked as being away

        // WHOIS/WHOWAS
        RplWhoisHelper      = 310,                  // <nick> :looks very helpful                                                       DALNET
        RplWhoIsUser        = 311,                  // <nick> <username> <address> * :<info>
        RplWhoIsServer      = 312,                  // <nick> <server> :<info>
        RplWhoIsOperator    = 313,                  // <nick> :is an IRC Operator
        RplWhoIsIdle        = 317,                  // <nick> <seconds> <signon> :<info>
        RplEndOfWhois       = 318,                  // <request> :End of /WHOIS list.
        RplWhoIsChannels    = 319,                  // <nick> :<channels>
        RplWhoWasUser       = 314,                  // <nick> <username> <address> * :<info>
        RplEndOfWhoWas      = 369,                  // <request> :End of WHOWAS
        RplWhoReply         = 352,                  // <channel> <username> <address> <server> <nick> <flags> :<hops> <info>
        RplEndOfWho         = 315,                  // <request> :End of /WHO list.
        RplUserIPs          = 307,                  // :userips                                                                         UNDERNET
        RplUserIP           = 340,                  // <nick> :<nickname>=+<user>@<IP.address>                                          UNDERNET

        // List
        RplListStart        = 321,                  // Channel :Users Name
        RplList             = 322,                  // <channel> <users> :<topic>
        RplListEnd          = 323,                  // :End of /LIST
        RplLinks            = 364,                  // <server> <hub> :<hops> <info>
        RplEndOfLinks       = 365,                  // <mask> :End of /LINKS list.

        // Post-Channel Join
        RplUniqOpIs         = 325,
        RplChannelModeIs    = 324,                  // <channel> <mode>
        RplChannelUrl       = 328,                  // <channel> :url                                                                   DALNET
        RplChannelCreated   = 329,                  // <channel> <time>
        RplNoTopic          = 331,                  // <channel> :No topic is set.
        RplTopic            = 332,                  // <channel> :<topic>
        RplTopicSetBy       = 333,                  // <channel> <nickname> <time>
        RplNamReply         = 353,                  // = <channel> :<names>
        RplEndOfNames       = 366,                  // <channel> :End of /NAMES list.

        // Invitational
        RplInviting         = 341,                  // <nick> <channel>
        RplSummoning        = 342,

        // Channel Lists
        RplInviteList       = 346,                  // <channel> <invite> <nick> <time>                                                 IRCNET
        RplEndOfInviteList  = 357,                  // <channel> :End of Channel Invite List                                            IRCNET
        RplExceptList       = 348,                  // <channel> <exception> <nick> <time>                                              IRCNET
        RplEndOfExceptList  = 349,                  // <channel> :End of Channel Exception List                                         IRCNET
        RplBanList          = 367,                  // <channel> <ban> <nick> <time>
        RplEndOfBanList     = 368,                  // <channel> :End of Channel Ban List


        // server/misc
        RplVersion          = 351,                  // <version>.<debug> <server> :<info>
        RplInfo             = 371,                  // :<info>
        RplEndOfInfo        = 374,                  // :End of /INFO list.
        RplYoureOper        = 381,                  // :You are now an IRC Operator
        RplRehashing        = 382,                  // <file> :Rehashing
        RplYoureService     = 383,
        RplTime             = 391,                  // <server> :<time>
        RplUsersStart       = 392,
        RplUsers            = 393,
        RplEndOfUsers       = 394,
        RplNoUsers          = 395,
        RplServList         = 234,
        RplServListEnd      = 235,
        RplAdminMe          = 256,                  // :Administrative info about server
        RplAdminLoc1        = 257,                  // :<info>
        RplAdminLoc2        = 258,                  // :<info>
        RplAdminEMail       = 259,                  // :<info>
        RplTryAgain         = 263,                  // :Server load is temporarily too heavy. Please wait a while and try again.

        // tracing
        RplTraceLink        = 200,
        RplTraceConnecting  = 201,
        RplTraceHandshake   = 202,
        RplTraceUnknown     = 203,
        RplTraceOperator    = 204,
        RplTraceUser        = 205,
        RplTraceServer      = 206,
        RplTraceService     = 207,
        RplTraceNewType     = 208,
        RplTraceClass       = 209,
        RplTraceReconnect   = 210,
        RplTraceLog         = 261,
        RplTraceEnd         = 262,

        // stats
        RplStatsLinkInfo    = 211,                  // <connection> <sendq> <sentmsg> <sentbyte> <recdmsg> <recdbyte> :<open>
        RplStatsCommands    = 212,                  // <command> <uses> <bytes>
        RplStatsCLine       = 213,                  // C <address> * <server> <port> <class>
        RplStatsNLine       = 214,                  // N <address> * <server> <port> <class>
        RplStatsILine       = 215,                  // I <ipmask> * <hostmask> <port> <class>
        RplStatsKLine       = 216,                  // k <address> * <username> <details>
        RplStatsPLine       = 217,                  // P <port> <??> <??>
        RplStatsQLine       = 222,                  // <mask> :<comment>
        RplStatsELine       = 223,                  // E <hostmask> * <username> <??> <??>
        RplStatsDLine       = 224,                  // D <ipmask> * <username> <??> <??>
        RplStatsLLine       = 241,                  // L <address> * <server> <??> <??>
        RplStatsuLine       = 242,                  // :Server Up <num> days, <time>
        RplStatsoLine       = 243,                  // o <mask> <password> <user> <??> <class>
        RplStatsHLine       = 244,                  // H <address> * <server> <??> <??>
        RplStatsGLine       = 247,                  // G <address> <timestamp> :<reason>
        RplStatsULine       = 248,                  // U <host> * <??> <??> <??>
        RplStatsZLine       = 249,                  // :info
        RplStatsYLine       = 218,                  // Y <class> <ping> <freq> <maxconnect> <sendq>
        RplEndOfStats       = 219,                  // <char> :End of /STATS report
        RplStatsUptime      = 242,

        // GLINE
        RplGLineList        = 280,                  // <address> <timestamp> <reason>                                                   UNDERNET
        RplEndOfGLineList   = 281,                  // :End of G-line List                                                              UNDERNET

        // Silence
        RplSilenceList      = 271,                  // <nick> <mask>                                                                    UNDERNET/DALNET
        RplEndOfSilenceList = 272,                  // <nick> :End of Silence List                                                      UNDERNET/DALNET

        // LUser
        RplLUserClient      = 251,                  // :There are <user> users and <invis> invisible on <serv> servers
        RplLUserOp          = 252,                  // <num> :operator(s) online
        RplLUserUnknown     = 253,                  // <num> :unknown connection(s)
        RplLUserChannels    = 254,                  // <num> :channels formed
        RplLUserMe          = 255,                  // :I have <user> clients and <serv> servers
        RplLUserLocalUser   = 265,                  // :Current local users: <curr> Max: <max>
        RplLUserGlobalUser  = 266,                  // :Current global users: <curr> Max: <max>


        // Errors
        ErrNoSuchNick       = 401,                  // <nickname> :No such nick
        ErrNoSuchServer     = 402,                  // <server> :No such server
        ErrNoSuchChannel    = 403,                  // <channel> :No such channel
        ErrCannotSendToChan = 404,                  // <channel> :Cannot send to channel
        ErrTooManyChannels  = 405,                  // <channel> :You have joined too many channels
        ErrWasNoSuchNick    = 406,                  // <nickname> :There was no such nickname
        ErrTooManyTargets   = 407,                  // <target> :Duplicate recipients. No message delivered
        ErrNoColors         = 408,                  // <nickname> #<channel> :You cannot use colors on this channel. Not sent: <text>   DALNET
        ErrNoOrigin         = 409,                  // :No origin specified
        ErrNoRecipient      = 411,                  // :No recipient given (<command>)
        ErrNoTextToSend     = 412,                  // :No text to send
        ErrNoTopLevel       = 413,                  // <mask> :No toplevel domain specified
        ErrWildTopLevel     = 414,                  // <mask> :Wildcard in toplevel Domain
        ErrBadMask          = 415,
        ErrTooMuchInfo      = 416,                  // <command> :Too many lines in the output, restrict your query                     UNDERNET
        ErrUnknownCommand   = 421,                  // <command> :Unknown command
        ErrNoMotd           = 422,                  // :MOTD File is missing
        ErrNoAdminInfo      = 423,                  // <server> :No administrative info available
        ErrFileError        = 424,
        ErrNoNicknameGiven  = 431,                  // :No nickname given
        ErrErroneusNickname = 432,                  // <nickname> :Erroneus Nickname
        ErrNickNameInUse    = 433,                  // <nickname> :Nickname is already in use.
        ErrNickCollision    = 436,                  // <nickname> :Nickname collision KILL
        ErrUnAvailResource  = 437,                  // <channel> :Cannot change nickname while banned on channel
        ErrNickTooFast      = 438,                  // <nick> :Nick change too fast. Please wait <sec> seconds.                         (most)
        ErrTargetTooFast    = 439,                  // <target> :Target change too fast. Please wait <sec> seconds.                     DALNET/UNDERNET
        ErrUserNotInChannel = 441,                  // <nickname> <channel> :They aren't on that channel
        ErrNotOnChannel     = 442,                  // <channel> :You're not on that channel
        ErrUserOnChannel    = 443,                  // <nickname> <channel> :is already on channel
        ErrNoLogin          = 444,
        ErrSummonDisabled   = 445,                  // :SUMMON has been disabled
        ErrUsersDisabled    = 446,                  // :USERS has been disabled
        ErrNotRegistered    = 451,                  // <command> :Register first.
        ErrNeedMoreParams   = 461,                  // <command> :Not enough parameters
        ErrAlreadyRegistered= 462,                  // :You may not reregister
        ErrNoPermForHost    = 463,
        ErrPasswdMistmatch  = 464,
        ErrYoureBannedCreep = 465,
        ErrYouWillBeBanned  = 466,
        ErrKeySet           = 467,                  // <channel> :Channel key already set
        ErrServerCanChange  = 468,                  // <channel> :Only servers can change that mode                                     DALNET
        ErrChannelIsFull    = 471,                  // <channel> :Cannot join channel (+l)
        ErrUnknownMode      = 472,                  // <char> :is unknown mode char to me
        ErrInviteOnlyChan   = 473,                  // <channel> :Cannot join channel (+i)
        ErrBannedFromChan   = 474,                  // <channel> :Cannot join channel (+b)
        ErrBadChannelKey    = 475,                  // <channel> :Cannot join channel (+k)
        ErrBadChanMask      = 476,
        ErrNickNotRegistered= 477,                  // <channel> :You need a registered nick to join that channel.                      DALNET
        ErrBanListFull      = 478,                  // <channel> <ban> :Channel ban/ignore list is full
        ErrNoPrivileges     = 481,                  // :Permission Denied- You're not an IRC operator
        ErrChanOPrivsNeeded = 482,                  // <channel> :You're not channel operator
        ErrCantKillServer   = 483,                  // :You cant kill a server!
        ErrRestricted       = 484,                  // <nick> <channel> :Cannot kill, kick or deop channel service                      UNDERNET
        ErrUniqOPrivsNeeded = 485,                  // <channel> :Cannot join channel (reason)
        ErrNoOperHost       = 491,                  // :No O-lines for your host
        ErrUModeUnknownFlag = 501,                  // :Unknown MODE flag
        ErrUsersDontMatch   = 502,                  // :Cant change mode for other users
        ErrSilenceListFull  = 511                   // <mask> :Your silence list is full                                                UNDERNET/DALNET

    };  // eo enum Reply

The RFC documents are certainly not useless! You are correct that you need to send USER followed by NICK. The NOTICE you are getting is that the IRC server is attempting to connect back to your PC via a protocol called IDENTD. It's a relatively simple protocol but the upshot of it is that it wants to know that a program on the host that is connected to the server, is using the local/remote ports that the server has.

Chances are, your firewall is preventing this (and you're probably not running an IDENTD server). This is not a huge problem, though a fully-fledged IRC client will implement it. You can find out more here. That goes in to much more detail. It's relatively simple to implement.

Most IRC servers will give up if it cannot connect to you, and I've forgotten the exact side-effect of this (it has been a while), but the next messages you want to look out for are the MOTD_START/MOTD/MOTD_END and ERR_NOMOTD. Only after you have received the end of the Message of the day, or handled the ERR_NOMOTD (there isn't one), can you then use JOIN to join channels.

Incidentally, this is a good RegEx for matching input from an IRC Server:

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

The IRC RFCs list all the possible codes and what they mean. I'm not sure why you think they are useless. Which ones have you been referencing?

EDIT

I looked up my old C++ code for IRC so I could be a bit more helpful. After connecting, it enters a stage (that I have labelled) negotiating:

Negotiating Stage:

  1. If a password has been specified for the server, send it PASS mypassword.
  2. Send the USER command.
  3. Enter the Negotiate Nickname Stage
  4. Wait for ERR_NOMOTD, END_OFMOTD. Until one of these comes, you're not "officially connected".

Negotiate Nickname Stage:

It's entirely possible that during connection, the nickname you want to use is already in use. Therefore the client should:

  1. Issue a NICK command
  2. If you receive a ERR_NICKINUSE response, issue it again. If you have no more nicknames to use, you can either bailout or prompt the user for another one.

Some other thing to consider:

  • Look our for the PING command. The server will send this when you're idle. Handle this as high-priority and return PONG with the data the server gave you. Failure to do this will ensure you get disconnected and when you're testing an IRC client, this can be a pain in the rear-end.

Bonus Fun

This is my enum for the IRC commands, you should be able to put this in to C# easily enough:

    // reply ids
    enum Reply
    {
        RplNone             = 0,
        // Initial
        RplWelcome          = 001,                  // :Welcome to the Internet Relay Network <nickname>
        RplYourHost         = 002,                  // :Your host is <server>, running version <ver>
        RplCreated          = 003,                  // :This server was created <datetime>
        RplMyInfo           = 004,                  // <server> <ver> <usermode> <chanmode>
        RplMap              = 005,                  // :map
        RplEndOfMap         = 007,                  // :End of /MAP
        RplMotdStart        = 375,                  // :- server Message of the Day
        RplMotd             = 372,                  // :- <info>
        RplMotdAlt          = 377,                  // :- <info>                                                                        (some)
        RplMotdAlt2         = 378,                  // :- <info>                                                                        (some)
        RplMotdEnd          = 376,                  // :End of /MOTD command.
        RplUModeIs          = 221,                  // <mode>

        // IsOn/UserHost
        RplUserHost         = 302,                  // :userhosts
        RplIsOn             = 303,                  // :nicknames

        // Away
        RplAway             = 301,                  // <nick> :away
        RplUnAway           = 305,                  // :You are no longer marked as being away
        RplNowAway          = 306,                  // :You have been marked as being away

        // WHOIS/WHOWAS
        RplWhoisHelper      = 310,                  // <nick> :looks very helpful                                                       DALNET
        RplWhoIsUser        = 311,                  // <nick> <username> <address> * :<info>
        RplWhoIsServer      = 312,                  // <nick> <server> :<info>
        RplWhoIsOperator    = 313,                  // <nick> :is an IRC Operator
        RplWhoIsIdle        = 317,                  // <nick> <seconds> <signon> :<info>
        RplEndOfWhois       = 318,                  // <request> :End of /WHOIS list.
        RplWhoIsChannels    = 319,                  // <nick> :<channels>
        RplWhoWasUser       = 314,                  // <nick> <username> <address> * :<info>
        RplEndOfWhoWas      = 369,                  // <request> :End of WHOWAS
        RplWhoReply         = 352,                  // <channel> <username> <address> <server> <nick> <flags> :<hops> <info>
        RplEndOfWho         = 315,                  // <request> :End of /WHO list.
        RplUserIPs          = 307,                  // :userips                                                                         UNDERNET
        RplUserIP           = 340,                  // <nick> :<nickname>=+<user>@<IP.address>                                          UNDERNET

        // List
        RplListStart        = 321,                  // Channel :Users Name
        RplList             = 322,                  // <channel> <users> :<topic>
        RplListEnd          = 323,                  // :End of /LIST
        RplLinks            = 364,                  // <server> <hub> :<hops> <info>
        RplEndOfLinks       = 365,                  // <mask> :End of /LINKS list.

        // Post-Channel Join
        RplUniqOpIs         = 325,
        RplChannelModeIs    = 324,                  // <channel> <mode>
        RplChannelUrl       = 328,                  // <channel> :url                                                                   DALNET
        RplChannelCreated   = 329,                  // <channel> <time>
        RplNoTopic          = 331,                  // <channel> :No topic is set.
        RplTopic            = 332,                  // <channel> :<topic>
        RplTopicSetBy       = 333,                  // <channel> <nickname> <time>
        RplNamReply         = 353,                  // = <channel> :<names>
        RplEndOfNames       = 366,                  // <channel> :End of /NAMES list.

        // Invitational
        RplInviting         = 341,                  // <nick> <channel>
        RplSummoning        = 342,

        // Channel Lists
        RplInviteList       = 346,                  // <channel> <invite> <nick> <time>                                                 IRCNET
        RplEndOfInviteList  = 357,                  // <channel> :End of Channel Invite List                                            IRCNET
        RplExceptList       = 348,                  // <channel> <exception> <nick> <time>                                              IRCNET
        RplEndOfExceptList  = 349,                  // <channel> :End of Channel Exception List                                         IRCNET
        RplBanList          = 367,                  // <channel> <ban> <nick> <time>
        RplEndOfBanList     = 368,                  // <channel> :End of Channel Ban List


        // server/misc
        RplVersion          = 351,                  // <version>.<debug> <server> :<info>
        RplInfo             = 371,                  // :<info>
        RplEndOfInfo        = 374,                  // :End of /INFO list.
        RplYoureOper        = 381,                  // :You are now an IRC Operator
        RplRehashing        = 382,                  // <file> :Rehashing
        RplYoureService     = 383,
        RplTime             = 391,                  // <server> :<time>
        RplUsersStart       = 392,
        RplUsers            = 393,
        RplEndOfUsers       = 394,
        RplNoUsers          = 395,
        RplServList         = 234,
        RplServListEnd      = 235,
        RplAdminMe          = 256,                  // :Administrative info about server
        RplAdminLoc1        = 257,                  // :<info>
        RplAdminLoc2        = 258,                  // :<info>
        RplAdminEMail       = 259,                  // :<info>
        RplTryAgain         = 263,                  // :Server load is temporarily too heavy. Please wait a while and try again.

        // tracing
        RplTraceLink        = 200,
        RplTraceConnecting  = 201,
        RplTraceHandshake   = 202,
        RplTraceUnknown     = 203,
        RplTraceOperator    = 204,
        RplTraceUser        = 205,
        RplTraceServer      = 206,
        RplTraceService     = 207,
        RplTraceNewType     = 208,
        RplTraceClass       = 209,
        RplTraceReconnect   = 210,
        RplTraceLog         = 261,
        RplTraceEnd         = 262,

        // stats
        RplStatsLinkInfo    = 211,                  // <connection> <sendq> <sentmsg> <sentbyte> <recdmsg> <recdbyte> :<open>
        RplStatsCommands    = 212,                  // <command> <uses> <bytes>
        RplStatsCLine       = 213,                  // C <address> * <server> <port> <class>
        RplStatsNLine       = 214,                  // N <address> * <server> <port> <class>
        RplStatsILine       = 215,                  // I <ipmask> * <hostmask> <port> <class>
        RplStatsKLine       = 216,                  // k <address> * <username> <details>
        RplStatsPLine       = 217,                  // P <port> <??> <??>
        RplStatsQLine       = 222,                  // <mask> :<comment>
        RplStatsELine       = 223,                  // E <hostmask> * <username> <??> <??>
        RplStatsDLine       = 224,                  // D <ipmask> * <username> <??> <??>
        RplStatsLLine       = 241,                  // L <address> * <server> <??> <??>
        RplStatsuLine       = 242,                  // :Server Up <num> days, <time>
        RplStatsoLine       = 243,                  // o <mask> <password> <user> <??> <class>
        RplStatsHLine       = 244,                  // H <address> * <server> <??> <??>
        RplStatsGLine       = 247,                  // G <address> <timestamp> :<reason>
        RplStatsULine       = 248,                  // U <host> * <??> <??> <??>
        RplStatsZLine       = 249,                  // :info
        RplStatsYLine       = 218,                  // Y <class> <ping> <freq> <maxconnect> <sendq>
        RplEndOfStats       = 219,                  // <char> :End of /STATS report
        RplStatsUptime      = 242,

        // GLINE
        RplGLineList        = 280,                  // <address> <timestamp> <reason>                                                   UNDERNET
        RplEndOfGLineList   = 281,                  // :End of G-line List                                                              UNDERNET

        // Silence
        RplSilenceList      = 271,                  // <nick> <mask>                                                                    UNDERNET/DALNET
        RplEndOfSilenceList = 272,                  // <nick> :End of Silence List                                                      UNDERNET/DALNET

        // LUser
        RplLUserClient      = 251,                  // :There are <user> users and <invis> invisible on <serv> servers
        RplLUserOp          = 252,                  // <num> :operator(s) online
        RplLUserUnknown     = 253,                  // <num> :unknown connection(s)
        RplLUserChannels    = 254,                  // <num> :channels formed
        RplLUserMe          = 255,                  // :I have <user> clients and <serv> servers
        RplLUserLocalUser   = 265,                  // :Current local users: <curr> Max: <max>
        RplLUserGlobalUser  = 266,                  // :Current global users: <curr> Max: <max>


        // Errors
        ErrNoSuchNick       = 401,                  // <nickname> :No such nick
        ErrNoSuchServer     = 402,                  // <server> :No such server
        ErrNoSuchChannel    = 403,                  // <channel> :No such channel
        ErrCannotSendToChan = 404,                  // <channel> :Cannot send to channel
        ErrTooManyChannels  = 405,                  // <channel> :You have joined too many channels
        ErrWasNoSuchNick    = 406,                  // <nickname> :There was no such nickname
        ErrTooManyTargets   = 407,                  // <target> :Duplicate recipients. No message delivered
        ErrNoColors         = 408,                  // <nickname> #<channel> :You cannot use colors on this channel. Not sent: <text>   DALNET
        ErrNoOrigin         = 409,                  // :No origin specified
        ErrNoRecipient      = 411,                  // :No recipient given (<command>)
        ErrNoTextToSend     = 412,                  // :No text to send
        ErrNoTopLevel       = 413,                  // <mask> :No toplevel domain specified
        ErrWildTopLevel     = 414,                  // <mask> :Wildcard in toplevel Domain
        ErrBadMask          = 415,
        ErrTooMuchInfo      = 416,                  // <command> :Too many lines in the output, restrict your query                     UNDERNET
        ErrUnknownCommand   = 421,                  // <command> :Unknown command
        ErrNoMotd           = 422,                  // :MOTD File is missing
        ErrNoAdminInfo      = 423,                  // <server> :No administrative info available
        ErrFileError        = 424,
        ErrNoNicknameGiven  = 431,                  // :No nickname given
        ErrErroneusNickname = 432,                  // <nickname> :Erroneus Nickname
        ErrNickNameInUse    = 433,                  // <nickname> :Nickname is already in use.
        ErrNickCollision    = 436,                  // <nickname> :Nickname collision KILL
        ErrUnAvailResource  = 437,                  // <channel> :Cannot change nickname while banned on channel
        ErrNickTooFast      = 438,                  // <nick> :Nick change too fast. Please wait <sec> seconds.                         (most)
        ErrTargetTooFast    = 439,                  // <target> :Target change too fast. Please wait <sec> seconds.                     DALNET/UNDERNET
        ErrUserNotInChannel = 441,                  // <nickname> <channel> :They aren't on that channel
        ErrNotOnChannel     = 442,                  // <channel> :You're not on that channel
        ErrUserOnChannel    = 443,                  // <nickname> <channel> :is already on channel
        ErrNoLogin          = 444,
        ErrSummonDisabled   = 445,                  // :SUMMON has been disabled
        ErrUsersDisabled    = 446,                  // :USERS has been disabled
        ErrNotRegistered    = 451,                  // <command> :Register first.
        ErrNeedMoreParams   = 461,                  // <command> :Not enough parameters
        ErrAlreadyRegistered= 462,                  // :You may not reregister
        ErrNoPermForHost    = 463,
        ErrPasswdMistmatch  = 464,
        ErrYoureBannedCreep = 465,
        ErrYouWillBeBanned  = 466,
        ErrKeySet           = 467,                  // <channel> :Channel key already set
        ErrServerCanChange  = 468,                  // <channel> :Only servers can change that mode                                     DALNET
        ErrChannelIsFull    = 471,                  // <channel> :Cannot join channel (+l)
        ErrUnknownMode      = 472,                  // <char> :is unknown mode char to me
        ErrInviteOnlyChan   = 473,                  // <channel> :Cannot join channel (+i)
        ErrBannedFromChan   = 474,                  // <channel> :Cannot join channel (+b)
        ErrBadChannelKey    = 475,                  // <channel> :Cannot join channel (+k)
        ErrBadChanMask      = 476,
        ErrNickNotRegistered= 477,                  // <channel> :You need a registered nick to join that channel.                      DALNET
        ErrBanListFull      = 478,                  // <channel> <ban> :Channel ban/ignore list is full
        ErrNoPrivileges     = 481,                  // :Permission Denied- You're not an IRC operator
        ErrChanOPrivsNeeded = 482,                  // <channel> :You're not channel operator
        ErrCantKillServer   = 483,                  // :You cant kill a server!
        ErrRestricted       = 484,                  // <nick> <channel> :Cannot kill, kick or deop channel service                      UNDERNET
        ErrUniqOPrivsNeeded = 485,                  // <channel> :Cannot join channel (reason)
        ErrNoOperHost       = 491,                  // :No O-lines for your host
        ErrUModeUnknownFlag = 501,                  // :Unknown MODE flag
        ErrUsersDontMatch   = 502,                  // :Cant change mode for other users
        ErrSilenceListFull  = 511                   // <mask> :Your silence list is full                                                UNDERNET/DALNET

    };  // eo enum Reply
为你拒绝所有暧昧 2024-12-28 05:30:59

也许您查看的是旧版本 (RFC 1459),而不是当前版本 (< a href="https://www.rfc-editor.org/rfc/rfc2812" rel="nofollow noreferrer">RFC第2812章

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

   001    RPL_WELCOME
          "Welcome to the Internet Relay Network
           <nick>!<user>@<host>"
   002    RPL_YOURHOST
          "Your host is <servername>, running version <ver>"
   003    RPL_CREATED
          "This server was created <date>"
   ...

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

Maybe you looked at an old version (RFC 1459) instead of the current version (RFC 2812) of the standard?

The latter one lists the numeric codes in Section 5 "Replies":

   001    RPL_WELCOME
          "Welcome to the Internet Relay Network
           <nick>!<user>@<host>"
   002    RPL_YOURHOST
          "Your host is <servername>, running version <ver>"
   003    RPL_CREATED
          "This server was created <date>"
   ...

(That should answer your second question; unfortunately, I'm not familiar enough with the protocol to answer your first. A simple solution to get you on the right track might be to trace the connection of an existing IRC client using some packet sniffer.)

空城之時有危險 2024-12-28 05:30:59

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

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

The codes can be found in this document, the ones you specified are:

  • 002 RPL_YOURHOST "Your host is , running version "
  • 003 RPL_CREATED "This server was created "
  • 005 RPL_BOUNCE "Try server , port "
  • 251 RPL_LUSERCLIENT ":There are users and services on servers"
  • 252 RPL_LUSEROP " :operator(s) online"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文