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:
- Nếu một mật khẩu đã được xác định cho máy chủ, gửi nó
PASS mypassword
.
- Gửi lệnh
USER
.
- Nhập Giai đoạn thương hiệu biệt hiệu
- Đợ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:
- Issue một lệnh
NICK
- 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
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. –
bất kỳ giải pháp cuối cùng nào có mã nguồn đầy đủ về nó? – Kiquenet