2011-12-13 13 views
6

मैंने आरएफसी को देखा है लेकिन मैं अभी भी संघर्ष कर रहा हूं। मैंने सी # में एक मूल क्लाइंट लिखा है लेकिन मुझे ठीक से कनेक्ट करने के लिए दस्तावेज़ नहीं मिल रहा है।आईआरसी क्लाइंट लिखने की कोशिश कर रहा है लेकिन कोड और कनेक्शन प्रोटोकॉल के संबंध में एक अच्छा संसाधन खोजने के लिए संघर्ष कर रहा है

एक बार जब मैं निक और उपयोगकर्ता की जानकारी को कनेक्ट और ट्रांसमिट करता हूं, तो मुझे एक चैनल में शामिल होने की आवश्यकता होती है। अगर मैं सीधे जॉइन करता हूं, तो कुछ भी नहीं होता - संभवतः क्योंकि यह बहुत जल्द है। मुझे इसे देरी करना है, लेकिन मुझे नहीं पता कि मुझे किस आदेश के लिए इंतजार करना है, यह जानने के लिए कि आगे बढ़ना ठीक है।

मैं सामान की तरह:

: irc.fish.net नोटिस प्राधि: आपके होस्टनाम को देख ...

और

: irc.fish.net 001 FishBot: आपका स्वागत है

साथ ही कोड 002, 003, 005, 251, 252 इत्यादि के साथ सामान, लेकिन मुझे कहीं भी ऑनलाइन नहीं मिल रहा है जो मुझे दिखाता है कि ये क्या हैं।

तो मेरे मूल 2 प्रश्न हैं: आप प्रतिक्रिया में जॉइन क्या भेजते हैं, और मैं कहां से आईआरसी कोड के अनुरूप कहां मिल सकता हूं? आरएफसी दस्तावेज बेकार था!

+0

हालांकि यह एक दर्दनाक समाधान है, तो आप हमेशा ऊपर MIRC हुक सकता है (या जो भी लोग इन दिनों का उपयोग करें) फ़िडलर के प्रॉक्सी उपयोग करने के लिए और आप यातायात के सभी देख सकते हैं यह एक कमरे में शामिल होने के लिए पर हस्ताक्षर करने से/acks अनुरोध। –

+0

इसके बारे में पूर्ण स्रोत कोड के साथ कोई अंतिम समाधान? – Kiquenet

उत्तर

13

आरएफसी दस्तावेज़ निश्चित रूप से बेकार नहीं हैं! आप सही हैं कि आपको USERNICK भेजना होगा। NOTICE आपको मिल रहा है कि आईआरसी सर्वर IDENTD नामक प्रोटोकॉल के माध्यम से अपने पीसी पर वापस कनेक्ट करने का प्रयास कर रहा है। यह अपेक्षाकृत सरल प्रोटोकॉल है लेकिन इसका अपवाद यह है कि यह जानना चाहता है कि सर्वर से जुड़े मेजबान पर एक प्रोग्राम, सर्वर के स्थानीय/दूरस्थ बंदरगाहों का उपयोग कर रहा है।

संभावना है, आपकी फ़ायरवॉल इसे रोक रही है (और आप शायद आईडीएन्टडी सर्वर नहीं चला रहे हैं)। यह एक बड़ी समस्या नहीं है, हालांकि एक पूरी तरह से विकसित आईआरसी ग्राहक इसे लागू करेगा। आप अधिक here देख सकते हैं। यह बहुत अधिक विस्तार में चला जाता है। यह लागू करने के लिए अपेक्षाकृत सरल है।

अधिकांश आईआरसी सर्वर दे देंगे अगर यह आप कनेक्ट नहीं कर सकता है, और मैं सटीक इस के पक्ष प्रभाव (यह एक समय हो गया है) भूल गए हैं, लेकिन अगले संदेशों आप कर रहे हैं के लिए बाहर देखने के लिए चाहते हैं MOTD_START/MOTD/MOTD_END और ERR_NOMOTD। के बाद आपको दिन के संदेश का अंत प्राप्त हुआ है, या ERR_NOMOTD (एक नहीं है) को संभाला है, तो आप चैनलों में शामिल होने के लिए JOIN का उपयोग कर सकते हैं।

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

आईआरसी RFC, सूची के लिए सभी संभव कोड और उनके अर्थ:

संयोग से, यह एक आईआरसी सर्वर से इनपुट मिलान के लिए एक अच्छा रेगुलर एक्सप्रेशन से है।मुझे यकीन नहीं है कि आप क्यों सोचते हैं कि वे बेकार हैं। आप किस संदर्भ में जा रहे हैं?

संपादित

मैं आईआरसी के लिए मेरे पुराने सी ++ कोड ऊपर देखा तो मैं थोड़ा और अधिक उपयोगी हो सकता है। कनेक्ट करने के बाद, यह एक चरण में प्रवेश करती है (कि मैं करार दिया है) बातचीत:

तोल-मोल स्टेज: कोई एक पासवर्ड सर्वर के लिए निर्दिष्ट किया गया है

  1. है, यह PASS mypassword भेजें।
  2. USER कमांड भेजें।
  3. नेगोशिएट उपनाम चरण
  4. ERR_NOMOTD, END_OFMOTD के लिए प्रतीक्षा करें। इनमें से कोई एक आने तक, आप "आधिकारिक रूप से जुड़े" नहीं हैं।

    ऐसा नहीं है कि कनेक्शन के दौरान, उपनाम का उपयोग करना चाहते से प्रयोग में है पूरी तरह से संभव है:

उपनाम स्टेज निगोशिएट। इसलिए ग्राहक को:

  1. जारी करना एक NICK आदेश
  2. आप फिर से एक ERR_NICKINUSE प्रतिक्रिया है, यह मुद्दा प्राप्त करते हैं। यदि आपके पास उपयोग करने के लिए कोई और उपनाम नहीं है, तो आप या तो उपयोगकर्ता को किसी अन्य के लिए बकाया या संकेत दे सकते हैं।

कुछ अन्य बात पर विचार करना:

  • देखो PING आदेश के लिए हमारी। जब आप निष्क्रिय होते हैं तो सर्वर इसे भेज देगा। इसे उच्च प्राथमिकता के रूप में संभालें और सर्वर द्वारा दिए गए डेटा के साथ PONG लौटाएं। ऐसा करने में विफलता यह सुनिश्चित करेगी कि आप डिस्कनेक्ट हो जाएं और जब आप आईआरसी क्लाइंट का परीक्षण कर रहे हों, तो यह पीछे के अंत में दर्द हो सकता है।

बोनस मज़ा

यह आईआरसी आज्ञाओं के लिए मेरी enum, आप आसानी से करने के लिए सी # में यह डाल करने के लिए सक्षम होना चाहिए है पर्याप्त:

// 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 
+0

चीयर्स, मैंने एमओटीडी के अंत की प्रतीक्षा करने के बारे में सोचा लेकिन यह थोड़ा हैकी लग रहा था। कमांड सूची के लिए धन्यवाद! – NibblyPig

+0

यह बिल्कुल हैकी नहीं है। जब तक यह नहीं पहुंच जाता है (या सर्वर को एक नहीं मिला है), आप कमांड भेजने के लिए "स्थिति" में नहीं हैं, इसलिए यह आदेश देने के लिए यह जानने के लिए सही उम्मीदवार बन जाता है। –

+0

आह ठीक है, धन्यवाद। – NibblyPig

3

शायद आपने मानक संस्करण (RFC 2812) के बजाय एक पुराने संस्करण (RFC 1459) को देखा है?

बाद एक धारा 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>" 
    ... 

(यही कारण है कि अपने दूसरे सवाल का जवाब चाहिए, दुर्भाग्य से, मैं प्रोटोकॉल अपना पहला एक जवाब देने के लिए साथ पर्याप्त परिचित नहीं हूँ। आपको सही ट्रैक पर लाने के लिए सरल समाधान कुछ packet sniffer का उपयोग कर मौजूदा आईआरसी क्लाइंट के कनेक्शन का पता लगाने के लिए हो सकता है।)

2

कोड this document में पाया जा सकता , जिन्हें आपने निर्दिष्ट किया है:

  • 002 RPL_YOURHOST "आपका होस्ट, चल रहा संस्करण"
  • 003 RPL_CREATED "यह सर्वर बनाया गया था"
  • 005 RPL_BOUNCE "सर्वर, बंदरगाह का प्रयास करें"
  • 251 RPL_LUSERCLIENT ": उन और सेवाओं सर्वर पर कर रहे हैं"
  • 252 RPL_LUSEROP ": ऑपरेटर (रों) ऑनलाइन"
संबंधित मुद्दे

 संबंधित मुद्दे