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

连接并发送NICK和USER信息后,我需要加入一个 channel 。如果我立即进行JOIN操作,则什么也不会发生-大概是因为太早了。我必须延迟它,但是我不知道我需要等待哪个命令才能知道可以继续执行。

我得到类似的东西:

:irc.fish.net注意事项:查找您的主机名...



:irc.fish.net 001 FishBot:欢迎

以及代码为002、003、005、251、252等的内容,但我找不到任何在线内容来显示这些内容。

所以我的两个基本问题是:您发送了一个JOIN作为响应,我在哪里可以找到上述IRC代码对应的内容? RFC文档没用!

最佳答案

RFC文档当然不是没有用的!正确,您需要先发送USER,再发送NICK。您得到的NOTICE是IRC服务器正在尝试通过称为IDENTD的协议(protocol)重新连接到您的PC。这是一个相对简单的协议(protocol),但它的最终结果是它想知道连接到服务器的主机上的程序正在使用服务器具有的本地/远程端口。

可能是,防火墙阻止了此操作(并且您可能未在运行IDENTD服务器)。尽管成熟的IRC客户端将实现它,但这并不是一个大问题。您可以找到更多here。这会涉及更多细节。实现起来相对简单。

如果大多数IRC服务器无法连接到您,它将放弃它,而我已经忘记了它的确切副作用(已经有一段时间了),但是您要查找的下一条消息是MOTD_START/MOTD/MOTD_END和ERR_NOMOTD。只有当您收到当天消息的结尾或处理了ERR_NOMOTD(没有消息)后,您才可以使用JOIN加入 channel 。

顺便说一句,这是一个很好的RegEx,可以匹配IRC服务器的输入:

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

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

编辑

我在IRC上查找了旧的C++代码,因此可能会有所帮助。连接后,它进入协商阶段(我已标记为该阶段):

谈判阶段:
  • 如果已为服务器指定了密码,请将其发送给PASS mypassword
  • 发送USER命令。
  • 进入协商昵称阶段
  • 等待ERR_NOMOTDEND_OFMOTD。在其中之一出现之前,您没有“正式联系”。

  • 协商昵称阶段:

    在连接过程中,您要使用的昵称很有可能已经被使用。因此,客户应:
  • 发出NICK命令
  • 如果收到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
    

    关于c# - 试图编写一个IRC客户端,但努力寻找有关代码和连接协议(protocol)的良好资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8490084/

    10-13 02:23