рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореИрдВрдиреЗ C # рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЯреНрд░реИрдХрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдиреЗрдЯ рдХреА рдЦреЛрдЬ рдХреА, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реА рдЦреЛрдЬ рдЕрд╕рдлрд▓ рд░рд╣реАред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реА # рдореЗрдВ рдПрдХ рдЯреНрд░реИрдХрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЦреБрдж рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рдореИрдВ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рднреА рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред рдФрд░ рд╕рд╛рде рд╣реА, рдЗрд╕рдХреЗ рд╕реБрдзрд╛рд░ рдкрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдЭрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рд▓реЗрдХрд┐рди рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ...
рдореИрдВрдиреЗ рдЬреЛ рдкрд╣рд▓рд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рд╡рд╣ рдмрд┐рдЯрдЯреЛрд░реЗрдВрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЦреБрд▓рд╛ рдерд╛:ред
рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ GET рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ: info_hash, peer_id, ip, port, рдЕрдкрд▓реЛрдб, рдбрд╛рдЙрдирд▓реЛрдб, рдмрд╛рдПрдВ рдФрд░ рдИрд╡реЗрдВрдЯред
рддрджрдиреБрд╕рд╛рд░, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдкрд░, рдореИрдВрдиреЗ рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ:
CREATE TABLE [dbo].[psy_trance_fm_bittorrent_announces] ( [id] [int] IDENTITY(1,1) NOT NULL, [info_hash] [char](40) NOT NULL, [peer_id] [char](40) NOT NULL, [ip] [varchar](512) NOT NULL, [port] [int] NOT NULL, [uploaded] [int] NOT NULL, [downloaded] [int] NOT NULL, [left] [int] NOT NULL, [event] [varchar](512) NULL )
рдпрд╣ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ / рд╕рд╛рджреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдмрд┐рдирдХреЛрдб рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред
рдПрдХ Bencoded рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЪрд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: string, int, list, рдФрд░ Dictionaryред
рдореИрдВрдиреЗ рдмреЗрдирдХреЛрдб рдореЗрдВ рдЪрд╛рд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗ - рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ:
public string encode(string _string) { StringBuilder string_builder = new StringBuilder(); string_builder.Append(_string.Length); string_builder.Append(":"); string_builder.Append(_string); return string_builder.ToString(); }
public string encode(int _int) { StringBuilder string_builder = new StringBuilder(); string_builder.Append("i"); string_builder.Append(_int); string_builder.Append("e"); return string_builder.ToString(); }
public string encode(List<object> list) { StringBuilder string_builder = new StringBuilder(); string_builder.Append("l"); foreach (object _object in list) { if (_object.GetType() == typeof(string)) { string_builder.Append(encode((string)_object)); } if (_object.GetType() == typeof(int)) { string_builder.Append(encode((int)_object)); } if (_object.GetType() == typeof(List<object>)) { string_builder.Append(encode((List<object>)_object)); } if (_object.GetType() == typeof(SortedDictionary<string, object>)) { string_builder.Append(encode((SortedDictionary<string, object>)_object)); } } string_builder.Append("e"); return string_builder.ToString(); }
public string encode(SortedDictionary<string, object> sorted_dictionary) { StringBuilder string_builder = new StringBuilder(); string_builder.Append("d"); foreach (KeyValuePair<string, object> key_value_pair in sorted_dictionary) { string_builder.Append(encode((string)key_value_pair.Key)); if (key_value_pair.Value.GetType() == typeof(string)) { string_builder.Append(encode((string)key_value_pair.Value)); } if (key_value_pair.Value.GetType() == typeof(int)) { string_builder.Append(encode((int)key_value_pair.Value)); } if (key_value_pair.Value.GetType() == typeof(List<object>)) { string_builder.Append(encode((List<object>)key_value_pair.Value)); } if (key_value_pair.Value.GetType() == typeof(SortedDictionary<string, object>)) { string_builder.Append(encode((SortedDictionary<string, object>)key_value_pair.Value)); } } string_builder.Append("e"); return string_builder.ToString(); }
рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЙрд░реНрдЯреЗрдбрдмрд╛рд░реНрдбрд░ <string, object>, рдФрд░ Dictionary <string, object> рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЦреИрд░, рдлрд┐рд░ рд╢реБрд░реВ рд╣реБрдЖ рдордЬрд╛ ...
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ GET рдЕрдиреБрд░реЛрдз рд╕реЗ info_hash рдФрд░ peer_id рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреНрд░рдорд╢рдГ Request.QueryString ["info_hash"] рдФрд░ Request.QueryString ["peer_id"] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреВрд░реА рдмрдХрд╡рд╛рд╕ рд╣реИрдВред рдмрд╣реБрдд рджреЗрд░ рддрдХ рдореИрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рдерд╛ ...
рдФрд░ рдмрд╛рдд рдпрд╣ рдереА: info_hash, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░реЗрд╖рд┐рдд, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:% 124Vx% 9A% BC% DE% F1% 23Eg% 89% AB% CD% EF% 124Vx% 9Aред Request.QueryString ["info_hash"] рдЗрд╕реЗ UTF-8 рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдирддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди FillFromString рдХреЛ рджреЗрдЦрдХрд░ рдЖрдк рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ Request.Url.Query рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдПрдХ рдХрдЪреНрдЪрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ Reflector рд╕реЗ FillFromString рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛:
string s = Request.Url.Query.Substring(1); SortedDictionary<string, object> parameters = new SortedDictionary<string, object>(StringComparer.Ordinal); int num = (s != null) ? s.Length : 0; for (int i = 0; i < num; i++) { int startIndex = i; int num4 = -1; while (i < num) { char ch = s[i]; if (ch == '=') { if (num4 < 0) { num4 = i; } } else if (ch == '&') { break; } i++; } string str = null; string str2 = null; if (num4 >= 0) { str = s.Substring(startIndex, num4 - startIndex); str2 = s.Substring(num4 + 1, (i - num4) - 1); } else { str2 = s.Substring(startIndex, i - startIndex); } parameters.Add("@" + str, str2); }
рдЦреИрд░, рдЕрдкрдиреЗ рдореВрд▓ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ info_hash рдФрд░ peer_id рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЛ рдФрд░ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреАрдВ:
parameters["@info_hash"] = BitConverter.ToString(HttpUtility.UrlDecodeToBytes((string)parameters["@info_hash"])).Replace("-", "").ToLower(); parameters["@peer_id"] = BitConverter.ToString(HttpUtility.UrlDecodeToBytes((string)parameters["@peer_id"])).Replace("-", "").ToLower();
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛, рдЖрдИрдкреА рдФрд░ рдШрдЯрдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рдЖрдИрдкреА тАЛтАЛрд╕рд░реНрд╡рд░ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдИрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рддреАрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ: рд╢реБрд░реВ рдХрд┐рдпрд╛, рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдФрд░ рд░реЛрдХрд╛ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝реЗрдВ:
if (parameters.ContainsKey("@ip") == false) { parameters.Add("@ip", Request.UserHostAddress); } if (parameters.ContainsKey("@event") == false) { parameters.Add("@event", DBNull.Value); }
рд╢реЗрд╖ рд╕рд░рд▓ рд╣реИред рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЛрдИ рд╡рд┐рддрд░рдг рд╣реИ рдЬреЛ рд╕рдВрдЪрд╛рд░рд┐рдд info_hash рдФрд░ peer_id рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдмрд╕ рд╡рд┐рддрд░рдг рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
psy_trance_fm.execute_scalar рдФрд░ psy_trance_fm.execute_non_query рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ рдФрд░ рдореИрдВ рдпрд╣рд╛рдВ рдмрд┐рдВрджреБ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред
psy_trance_fm psy_trance_fm = new psy_trance_fm(); if (psy_trance_fm.execute_scalar("SELECT * FROM [dbo].[psy_trance_fm_bittorrent_announces] WHERE [info_hash] = @info_hash AND [peer_id] = @peer_id", parameters, CommandType.Text) == null) { psy_trance_fm.execute_non_query("INSERT INTO [dbo].[psy_trance_fm_bittorrent_announces] ([info_hash], [peer_id], [ip], [port], [uploaded], [downloaded], [left], [event]) VALUES (@info_hash, @peer_id, @ip, @port, @uploaded, @downloaded, @left, @event)", parameters, CommandType.Text); } else { psy_trance_fm.execute_non_query("UPDATE [dbo].[psy_trance_fm_bittorrent_announces] SET [ip] = @ip, [port] = @port, [uploaded] = @uploaded, [downloaded] = @downloaded, [left] = @left, [event] = @event WHERE [info_hash] = @info_hash AND [peer_id] = @peer_id", parameters, CommandType.Text); }
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмреЗрдирдХреЛрдб рдХрд┐рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
SortedDictionary<string, object> sorted_dictionary = new SortedDictionary<string, object>(StringComparer.Ordinal); sorted_dictionary.Add("interval", 60); List<object> peers = new List<object>(); DataTable data_table = psy_trance_fm.fill("SELECT * FROM [dbo].[psy_trance_fm_bittorrent_announces] WHERE [info_hash] = @info_hash", parameters, CommandType.Text); foreach (DataRow data_row in data_table.Rows) { SortedDictionary<string, object> peer = new SortedDictionary<string, object>(StringComparer.Ordinal); peer.Add("peer id", data_row["peer_id"]); peer.Add("ip", data_row["ip"]); peer.Add("port", data_row["port"]); peers.Add(peer); } sorted_dictionary.Add("peers", peers); bencode bencode = new bencode(); Response.Write(bencode.encode(sorted_dictionary));
рдЦреИрд░, рдпрд╣ рдмрд╛рдд рд╣реИ! рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реА # рдмрд┐рдЯрдЯреЛрд░реЗрдВрдЯ рдЯреНрд░реИрдХрд░ рддреИрдпрд╛рд░ рд╣реИред рд╣рд╛рдВ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рд╕рд╛рдВрдЦреНрдпрд┐рдХреА, рдФрд░ рдЗрддрдиреЗ рдкрд░ рдФрд░ рдЖрдЧреЗ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдордЭрджрд╛рд░ рд▓реЛрдЧ рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░рдирд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдЭрд╛рд╡ рджреЗрдВрдЧреЗред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!