2011-12-13 27 views
6

Tôi đã xem RFC nhưng vẫn đang gặp khó khăn. Tôi đã viết một khách hàng cơ bản trong C# nhưng tôi không thể tìm thấy tài liệu hướng dẫn về cách kết nối đúng cách.Cố gắng viết một khách hàng IRC nhưng cố gắng tìm một nguồn tài nguyên tốt về mã và giao thức kết nối

Khi tôi kết nối và truyền thông tin NICK và USER, tôi cần tham gia một kênh. Nếu tôi làm một JOIN ngay lập tức, không có gì xảy ra - có lẽ vì nó quá sớm. Tôi phải trì hoãn nó, nhưng tôi không biết lệnh nào tôi cần phải chờ đợi để biết rằng có thể đi tiếp.

tôi nhận được những thứ như:

: irc.fish.net THÔNG BÁO AUTH: nhìn lên tên máy của bạn ...

: irc.fish.net 001 FishBot: Chào mừng

cũng như các nội dung có mã 002, 003, 005, 251, 252, v.v. nhưng tôi không thể tìm thấy bất kỳ nơi nào trực tuyến hiển thị cho tôi những thông tin này là gì.

Vì vậy, 2 câu hỏi cơ bản của tôi là: Bạn gửi câu trả lời nào để trả lời và tôi có thể tìm mã IRC nào ở trên tương ứng với? Tài liệu RFC vô dụng!

+0

Trong khi đó là giải pháp đau đớn, bạn luôn có thể kết nối MIRC (hoặc bất kỳ người nào sử dụng những ngày này) để sử dụng proxy của Fiddler và bạn có thể xem tất cả lưu lượng truy cập của nó từ khi đăng nhập vào phòng. –

+0

bất kỳ giải pháp cuối cùng nào có mã nguồn đầy đủ về nó? – Kiquenet

Trả lời

13

Tài liệu RFC chắc chắn không phải là vô ích! Bạn đúng là bạn cần gửi USER, tiếp theo là NICK. NOTICE bạn đang nhận được là máy chủ IRC đang cố gắng kết nối lại với PC của bạn thông qua giao thức có tên là IDENTD. Đó là một giao thức tương đối đơn giản nhưng kết quả của nó là nó muốn biết rằng một chương trình trên máy chủ được kết nối với máy chủ, đang sử dụng các cổng cục bộ/từ xa mà máy chủ có.

Rất có thể, tường lửa của bạn đang ngăn chặn điều này (và có thể bạn đang không chạy máy chủ IDENTD). Đây không phải là một vấn đề lớn, mặc dù một khách hàng IRC chính thức sẽ thực hiện nó. Bạn có thể tìm hiểu thêm here. Điều đó đi vào chi tiết hơn nhiều. Nó tương đối đơn giản để thực hiện.

Hầu hết các máy chủ IRC sẽ từ bỏ nếu nó không thể kết nối với bạn và tôi đã quên hiệu ứng phụ chính xác của điều này (nhưng đã một lúc), nhưng các tin nhắn tiếp theo bạn muốn xem là MOTD_START/MOTD/MOTD_END và ERR_NOMOTD. Chỉ sau bạn mới nhận được kết thúc Thư trong ngày hoặc xử lý ERR_NOMOTD (không có), sau đó bạn có thể sử dụng JOIN để tham gia các kênh.

Ngẫu nhiên, đây là một RegEx tốt cho phù hợp với đầu vào từ một máy chủ IRC:

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

Các IRC RFC danh sách tất cả các mã tốt và ý nghĩa của chúng.Tôi không chắc tại sao bạn nghĩ họ vô dụng. Bạn đã tham khảo cái nào?

EDIT

Tôi nhìn lên cũ ++ mã C của tôi cho IRC vì vậy tôi có thể là một chút hữu ích hơn. Sau khi kết nối, nó đi vào một giai đoạn (mà tôi đã dán nhãn) đàm phán:

Đàm phán Stage:

  1. Nếu một mật khẩu đã được xác định cho máy chủ, gửi nó PASS mypassword.
  2. Gửi lệnh USER.
  3. Nhập Giai đoạn thương hiệu biệt hiệu
  4. Đợi ERR_NOMOTD, END_OFMOTD. Cho đến khi một trong số này xuất hiện, bạn không "kết nối chính thức".

Negotiate Nickname Stage:

Nó hoàn toàn có thể trong quá trình kết nối, nickname bạn muốn sử dụng đã được sử dụng. Vì vậy khách hàng nên:

  1. Issue một lệnh NICK
  2. Nếu bạn nhận được một ERR_NICKINUSE Đáp lại, vấn đề đó một lần nữa. Nếu bạn không có thêm biệt hiệu để sử dụng, bạn có thể giải cứu hoặc nhắc người dùng cho một biệt hiệu khác.

Một số điều khác cần cân nhắc:

  • Nhìn của chúng tôi cho lệnh PING. Máy chủ sẽ gửi thông báo này khi bạn rảnh. Xử lý mức độ ưu tiên cao này và trả lại PONG với dữ liệu mà máy chủ đã cung cấp cho bạn. Việc không làm điều này sẽ đảm bảo bạn bị ngắt kết nối và khi bạn đang thử nghiệm một ứng dụng khách IRC, điều này có thể là một cơn đau ở phía sau.

Bonus Fun

Đây là enum của tôi cho các lệnh IRC, bạn sẽ có thể đặt điều này trong C# một cách dễ dàng đủ:

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

Chúc mừng, tôi đã nghĩ đến việc chờ kết thúc MOTD nhưng có vẻ hơi khó khăn. Cảm ơn bạn đã có danh sách lệnh! – NibblyPig

+0

Nó không phải là hacky cả. Cho đến khi nó đến (hoặc máy chủ chưa có), bạn không ở trạng thái "" để gửi lệnh, vì vậy nó kết thúc là ứng cử viên hoàn hảo để xem để biết khi nào nên ra lệnh. –

+0

Ah được rồi, cảm ơn. – NibblyPig

3

Có thể bạn đã xem phiên bản cũ (RFC 1459) thay vì phiên bản hiện tại (RFC 2812) của tiêu chuẩn?

Người thứ hai liệt kê các mã số tại Mục 5 "Trả lời":

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>" 
    ... 

(Điều đó sẽ trả lời câu hỏi thứ hai của bạn, thật không may, tôi không đủ quen thuộc với giao thức để trả lời đầu tiên của bạn A. giải pháp đơn giản để giúp bạn đi đúng hướng có thể là theo dõi kết nối của ứng dụng khách IRC hiện tại bằng cách sử dụng một số packet sniffer.)

2

Các mã có thể được tìm thấy trong this document , những thứ bạn đã chỉ định là:

  • 002 RPL_YOURHOST "Máy chủ lưu trữ của bạn đang chạy phiên bản"
  • 003 RPL_CREATED "Máy chủ này được tạo ra"
  • 005 RPL_BOUNCE "Thử máy chủ, cổng"
  • 251 RPL_LUSERCLIENT ": Có người sử dụng và các dịch vụ trên các máy chủ"
  • 252 RPL_LUSEROP ": nhà điều hành (s) trực tuyến"
Các vấn đề liên quan