рд╣рдо рд╡рд┐рддрд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдпрд╛ рдЕрд╕рдВрднрд╡ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ

рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдЕрд░реНрдерд╛рддреН 5 рдЬреВрди рдХреЛ, alan008 рдирд╛рдордХ рдПрдХ рд╣реИрдмрд░рдореИрди рдиреЗ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛ред рдореБрдЭреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрд╕реЗ рдпрд╣рд╛рдВ рд▓рд╛рдКрдВрдЧрд╛:

рдорджрдж рдЪрд╛рд╣рд┐рдП!

рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреНрд░рд╛рд╣рдХреЛрдВ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ uTorrent) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧреА рдЯреНрд░реИрдХрд░реНрд╕ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд░рдЯреНрд░реИрдХрд░ рдХреЗ рд╕рд╛рде) рд╕реЗ рдХрдИ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрд╛рдж рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛, uTorrent рдЙрдиреНрд╣реЗрдВ рддрджрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред рдХрдИ .torrent рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрдиреЗ рдЖрдк рдкреБрд░рд╛рдиреА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .torrent рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдХрд░ рдирдИ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬреЛрдбрд╝рдХрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╡рд┐рддрд░рд┐рдд рдХреА рдЧрдИ рдереА)ред

рдЕрдм рд╕рд╡рд╛рд▓ рдЦреБрдж: рдХреНрдпрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ (рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ) .torrent рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд╛рд░реНрдХрд┐рдХ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рдмрд┐рдЦрд░реА рд╣реБрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ? рдЙрджреНрджреЗрд╢реНрдп: рдЕрдирд╛рд╡рд╢реНрдпрдХ (рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ) .рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП - рд╡рд┐рддрд░рдг рдкрд░ рд╕рдм рдХреБрдЫ рдбрд╛рд▓ рджреЗрдВред рдХрд┐рд╕рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЖрдЗрдбрд┐рдпрд╛ рд╣реИ? :)

рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ), рдЖрдк рдлрд┐рд░ рд╕реЗ рдПрдХ рд╣реА рд▓реЙрдЬрд┐рдХрд▓ рдбреНрд░рд╛рдЗрд╡ рдкрд░ рд╕рднреА рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд░реНрдЪрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рдереА рдХрд┐ рдпрджрд┐ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдХрд▓рдо рдХреЗ рд╕рд╛рдеред рдпрд╣ рд╕рд╡рд╛рд▓ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрд╛ рдФрд░ рдЫреБрдЯреНрдЯреА рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд▓рд┐рдпрд╛ред

рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдХреБрд▓ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж .рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╢реНрди рдореЗрдВ рдЙрдард╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
  1. рдпрд╣ рдмрд╣реБрдд рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВред
  2. .Torrent рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдк рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЧрд╛ред
  3. рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЬреЛ рдХрдИ рдмрд╛рд░ рдХрдо-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИрдВ - рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХреБрдЫ рдмреЗрд╣рддрд░, рдЕрдзрд┐рдХ рдЖрд╢рд╛рд╡рд╛рджреА рдФрд░ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдП, рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рдФрд░ рдиреБрдХрд╕рд╛рди - рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ - рдлрд┐рд░ рд╕реЗ рдкрдВрдк рдХрд░рдирд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛! рддреЛ, рд╣рдо рдХрдард┐рди рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ - рдбрд╛рдЙрдирд▓реЛрдб рди рдХрд░реЗрдВ ред

рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдмреБрдирд┐рдпрд╛рджреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рджреЛ рдЪрд░рдгреЛрдВ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:

  1. рд╕рднреА .torrent рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВ рдФрд░ рдкрдврд╝реЗрдВ;
  2. рдлрд╝рд╛рдЗрд▓ рдХреЗ рдвреЗрд░ рдкрд░ рдЦреЛрдЬреЗрдВ рдЬреЛ рдХрд┐ .torrent рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ .torrent рдореЗрдВ рдкрде рдХреЗ рдЕрдиреБрд░реВрдк рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдБред

рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ C # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ bencode рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ SHA-1 рд╣реИрд╢ рдХреЛ рдкрдврд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдХрд╛рд░реНрдп рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рд╣рдо рдЯреЙрд░реЗрдВрдЯ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ



рдЬрдм рдореИрдВрдиреЗ рдЙрдкрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рддреЛ .torrent-files, рдореБрдЭреЗ рдЗрд╕ рд╕рднреА рдЪрдорддреНрдХрд╛рд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╡рд╛рд▓ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЛ рдмрд┐рдЦреЗрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЗ рд▓рд┐рдП рдХрдИ .NET рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреАред рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЛ BencodeLibrary рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЪреБрдирд╛, рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рдФрд░ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдореБрдЭреЗ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХред

рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ - рдкрдврд╝рдирд╛ред

.Torrent рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдпрд╣ рдмреЗрдирдХреЛрдб рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИред рдЗрд╕ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рдЬреЛрдбрд╝реА рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдг рдмреНрд▓реЙрдХред рдпрд╣ рднреА рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд╛рдо, рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рдЯреЛрд░реЗрдВрдЯ рд╣реИрд╢ рдлрд╛рдЗрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╣реИ, рдЬреЛ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рднреА рдЬрд╛рдирдХрд╛рд░реА рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред

рдкрдарди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Torrent рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
рд╡рд░реНрдЧ рдзрд╛рд░
 public class Torrent { public Torrent(string name, List<LostFile> files, int pieceLength, char[] hash, string fileName) { Name = name; Files = files; PieceLength = pieceLength; Hash = hash; FileName= fileName; } public string Name; public int PieceLength; public char[] Hash; public List<LostFile> Files; public string FileName; ... } 

рдпрд╣рд╛рдБ рдлрд╝реАрд▓реНрдб рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ:

* Name - рдзрд╛рд░ рдирд╛рдо (рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ - рдлрд╝реЛрд▓реНрдбрд░ рдирд╛рдо рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо)
* Files - рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
* PieceLength -рдЖрдХрд╛рд░ - рдЙрди рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЖрдХрд╛рд░, рдЬрд┐рди рдкрд░ рд╣рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИ
* Hash - рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╣реИрд╢ рд╕реНрдЯреНрд░рд┐рдВрдЧ
* FileName - рдбрд┐рд╕реНрдХ рдкрд░ .torrent рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо

рдЕрдм рдпрд╣ рд╣реИрд╢ рд▓рд╛рдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ (рд▓рдЧрднрдЧ) рдореЗрдВ рдЪрд┐рдкрдХрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ BIGOOOOOOOY рдХрд╛рд▓реНрдкрдирд┐рдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд▓реНрдкрдирд┐рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдо рд▓рдВрдмрд╛рдИ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓реЗ PieceLength , SHA1 рд╣реИрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╣реИрд╢ рдХреЛ рд▓рд╛рдЗрди рдкрд░ рд░рдЦрддреЗ рд╣реИрдВ, рдЕрдЧрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рд╣реИрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдпрд╣ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╣реИрд╢ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдпреЛрдЬрди рд╣реИред



рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ LostFile рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрдорд╛рдг рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:
рдХреНрд▓рд╛рд╕ рд▓реЙрдлрд╛рдЗрд▓
 public class LostFile { public LostFile(string name, long length, long beginFrom) { Name = name; Length = length; BeginFrom = beginFrom; } public string Name; public long Length; public long BeginFrom; . . . } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рдЙрд╕рдХрд╛ рдЖрдХрд╛рд░ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдФрд░ рдХреНрд╖реЗрддреНрд░ рд╣реИ - BeginFrom ред рдпрд╣ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╡рд░реНрдгрди рдЙрд╕ рдмрдбрд╝реА рдХрд╛рд▓реНрдкрдирд┐рдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рд╣реА рд╣рд┐рд╕реНрд╕рд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреА рд▓рдВрдмрд╛рдИ рдмрд╣реБрдд рдХрдо рд╣реА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЯреБрдХрдбрд╝реЗ рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдХрдИ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред



рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдПрдВ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрдиреНрд╣реЗрдВ рднрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА BodeodeLibrary рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╣рдорд╛рд░реА .torrent рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рд╕реВрдЪрдирд╛ рдмреНрд▓реЙрдХ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:

 List<LostFile> files = new List<LostFile>(); //  ,   BDict torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.UTF8); BDict fileInfo = (BDict)torrent["info"]; 

рдЕрдЧрд▓рд╛, рдЗрд╕ рдмреНрд▓реЙрдХ рд╕реЗ, рдЖрдкрдХреЛ рдЯреЛрд░реЗрдВрдЯ рдХреЗ рдирд╛рдо, рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 string name = ((BString)fileInfo["name"]).Value; int pieceLength = (int)((BInt)fileInfo["piece length"]).Value; 

рд╣реИрд╢ рдкрдврд╝рдиреЗ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА, рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐, рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, .torrent рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рд▓рд╛рдЗрдиреЗрдВ UFT8 рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рд╣реИрд╢ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рдпреВрдПрдирдПрдл 8 рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмреЗрдирдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рддреБрд▓рдирд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА - рд╕рдорд╛рди рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рд╣реИрд╢ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧрд╛ред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛрдбрдкреЗрдЬ -437 рдореЗрдВ рдзрд╛рд░ рдкрдврд╝рдиреЗ рд╕реЗ рд╣рдореЗрдВ рд░рд╛рд╕реНрддреЛрдВ рдореЗрдВ рд░реВрд╕реА рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВред рдореБрдЭреЗ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рджреЛ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзреАрдорд╛ рдХрд░ рджрд┐рдпрд╛, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рдирд╛ - рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рджреЛ рдмрд╛рд░ рдкрдврд╝рдирд╛ред

 torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.GetEncoding(437)); char[] pieces = ((BString)((BDict)torrent["info"])["pieces"]).Value.ToCharArray(); 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реВрдЪрдирд╛ рдХреЛ 'BencodingUtils.DecodeFile` рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдареАрдХ рдЙрд╕реА рдХреНрд╖рдг рд╣реИ рдЬрдм рдЖрдкрдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рдерд╛ - рд╢реБрд░реВ рдореЗрдВ рдХреЛрдбрдкреЗрдЬ -437 рдХреЛ рдХреЛрдб рдореЗрдВ рд╕реАрд╡рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣рдореЗрдВ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдорд┐рд▓реА - рдлрд╛рдЗрд▓ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдирд╛ред рдЯреЛрд░реЗрдВрдЯ рдлрд╛рдЗрд▓реЗрдВ рджреЛ рддрд░рд╣ рдХреА рд╣реЛрддреА рд╣реИрдВред рдпреЗ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рдХрд┐рддрдиреА рдлрд╛рдЗрд▓реЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдХреЗрд╡рд▓ .torrent рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рдЙрд╕рдХрд╛ рдирд╛рдо рдФрд░ рдЖрдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде .torrent рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

 long Length = ((BInt)fileInfo["length"]).Value; files.Add(new LostFile(name, Length, 0)); // files -   

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдзрд╛рд░ рдХрд╛ рдирд╛рдо рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рд╡рд┐рддрд░рдг рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рддреЛ рдЬрд┐рд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрд╕рдХрд╛ рдирд╛рдо рдирд╛рдо рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╣рд░ рдХреЛрдИ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдирд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рд╕реНрдерд┐рдд рдереАрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ: рдЗрд╕рдХрд╛ рдкрде рдФрд░ рдЖрдХрд╛рд░ред рдпрджрд┐ рдЖрдХрд╛рд░ рд╕рд┐рд░реНрдл рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдкрде рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдореЛрдВ) рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП level_1\level_2_1\file_1.txt рдФрд░ level_1\level_2_2\file_2.txt , рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдирд╛рдо рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдлрд╝реЛрд▓реНрдбрд░ ( "level_1" ) рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛, рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдкрде рд╕реВрдЪреА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧреА: {"level_2_1", "file_1.txt"} рдФрд░ {"level_2_2", "file_2.txt"} рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдПред

рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде .torrent рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд▓рд╛рдЗрди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдЙрд╕ BOLSHOOOOM рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдордд рднреВрд▓рдирд╛!)ред)

 BList filesData = (BList)fileInfo["files"]; long begin = 0; foreach (BDict file in filesData) { BList filePaths = (BList)file["path"]; long length = ((BInt)file["length"]).Value; string fullPath = name; foreach (BString partOfPath in filePaths) { fullPath += @"\" + partOfPath.Value; } files.Add(new LostFile(fullPath, length, begin)); // files -   begin += length; } 


рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдмреЛрд▓реНрд╢реВрдУрдо рдлрд╛рдЗрд▓ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреНрд░рдо рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдпрд╛ рдЖрдХрд╛рд░ рдореЗрдВред рд▓реЗрдХрд┐рди рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдХреНрд░рдо рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдпрд╣ рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА: {"file_3","file_1", ..., "file_2"} ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╣реИрд╢ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдЬрдм рд╣рдо рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЧрд┐рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдП Torrent рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдПрдБ рдФрд░ Torrent :

 new Torrent(name, files, pieceLength, pieces, filename); 

.Torrent рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рднреА рд░реАрдбрд┐рдВрдЧ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдПрдХ рд╕рд╛рде рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
ReadTorrent
 static Torrent ReadTorrent(string filename) { List<LostFile> files = new List<LostFile>(); BDict torrent = (BDict)BencodingUtils.DecodeFile(filename); BDict fileInfo = (BDict)torrent["info"]; string name = ((BString)fileInfo["name"]).Value; int pieceLength = (int)((BInt)fileInfo["piece length"]).Value; torrent = (BDict)BencodingUtils.DecodeFile(filename, Encoding.GetEncoding(437)); char[] pieces = ((BString)((BDict)torrent["info"])["pieces"]).Value.ToCharArray(); if (fileInfo.ContainsKey("files")) // Multifile torrent { BList filesData = (BList)fileInfo["files"]; long begin = 0; foreach (BDict file in filesData) { BList filePaths = (BList)file["path"]; long length = ((BInt)file["length"]).Value; string fullPath = name; foreach (BString partOfPath in filePaths) { fullPath += @"\" + partOfPath.Value; } files.Add(new LostFile(fullPath, length, begin)); begin += length; } } else // Singlefile torrent { long Length = ((BInt)fileInfo["length"]).Value; files.Add(new LostFile(name, Length, 1)); } return new Torrent(name, files, pieceLength, pieces, filename); } 

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ - рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬред

рд╣рдо рдлрд╛рдЗрд▓реЗрдВ рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ



рд╣рдо рдЕрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рджреВрд╕рд░реЗ рдЪрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд░реАрдм рдЖрдП рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдлреЙрд░реНрдо рдХреЗ FindFiles рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 void FindFiles(Torrent torrent, List<FileInfo> files, string destinationPath) {} 

рдпрд╣рд╛рдВ files рдЙрди files рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рдирдХреЗ рдмреАрдЪ рд╣рдо рдЦреЛрдЬ рдХрд░реЗрдВрдЧреЗ, destinationPath рдЧрдВрддрд╡реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдлрд╛рдЗрд▓реЗрдВ рд░рдЦреА рдЬрд╛рдПрдВрдЧреАред

рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ .torrent рдХреЗ рд▓рд┐рдП рд╣рдо рдвреЗрд░ рд╕реЗ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд╣реИрд╢ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдХрд╛рдлреА рдорд╣рдВрдЧрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдмрд╛рдИрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЦреИрд░, рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЬрдЬ: рдЕрдЧрд░ рдореИрдВрдиреЗ .mp3 рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ред рдирд╛рдо рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

 FileInfo fileOnDisk = files[j]; if (fileOnDisk.Extension != Path.GetExtension(fileInTorrent.Name)) continue; 

рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрджрд┐рдЧреНрдз рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝реА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╣рдо рд╣реИрд╢ рдХреА рдЬрд╛рдБрдЪ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 if (!torrent.CheckHash(i, fileOnDisk)) continue; 

рд╕рддреНрдпрд╛рдкрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рдХрд┐ рдЬрд┐рд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдо рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рдкрде рдХреЗ рд╕рд╛рде рдЧрдВрддрд╡реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рднреА рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВред copyFile - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдлреЙрд░реНрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдЪрд░, рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИред

 FileInfo fileToMove = new FileInfo(destinationPath + @"\" + fileInTorrent.Name); if (!Directory.Exists(fileToMove.DirectoryName)) Directory.CreateDirectory(fileToMove.DirectoryName); if (!fileToMove.Exists) { // -  if (copyFile) File.Copy(fileOnDisk.FullName, fileToMove.FullName); else File.Move(fileOnDisk.FullName, fileToMove.FullName); //     files.Remove(fileOnDisk); //     torrent.Files.RemoveAt(i--); break; //      ,      torrent } 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдмрд┐рдВрджреБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдореИрдВ рдЕрдВрддрд┐рдо рджреЛ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ - рдпреЗ рдкрдВрдХреНрддрд┐рдпрд╛рдБ:

 files.Remove(fileOnDisk); torrent.Files.RemoveAt(i--); 

рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рдЫрдВрдЯрд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрд╛, рдЬреЛ рдЦреЛрдЬ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░ рджреЗрдЧрд╛ред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рд╢рд╛рдорд┐рд▓ рд╣реИред .RemoveAt(i--); рдЪреВрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЕрдЧрд▓рд╛ рддрддреНрд╡ рд▓реВрдк рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдП, рди рдХрд┐ рдПрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

рдЕрдм рдкрд╣рд▓реЗ рдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдореБрдЭреЗ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП foreach рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЗрд╕ рд╕реНрдкреАрдХрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:
ReadTorrent
 public static void FindFiles(Torrent torrent, List<FileInfo> files, string destinationPath, bool copyFile) { for (int i = 0; i < torrent.Files.Count; i++)// (LostFile fileInTorrent in torrent.Files) { LostFile fileInTorrent = torrent.Files[i]; for (int j = 0; j < files.Count; j++) { FileInfo fileOnDisk = files[j]; //       if (fileOnDisk.Extension != Path.GetExtension(fileInTorrent.Name)) continue; //   if (fileOnDisk.Length != fileInTorrent.Length) continue; //   if (!torrent.CheckHash(i, fileOnDisk)) continue; //   .     //   FileInfo fileToMove = new FileInfo(destinationPath + @"\" + fileInTorrent.Name); if (!Directory.Exists(fileToMove.DirectoryName)) Directory.CreateDirectory(fileToMove.DirectoryName); if (!fileToMove.Exists) { if (copyFile) File.Copy(fileOnDisk.FullName, fileToMove.FullName); else File.Move(fileOnDisk.FullName, fileToMove.FullName); //      files.Remove(fileOnDisk); //     torrent.Files.RemoveAt(i--); break; } } } } 

рдЦреИрд░ рдпрд╣рд╛рдБ! рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯред

рд╣реИрд╢ рдЪреЗрдХ



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИрд╢ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирдВрдмрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЦреЛрдЬ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдЗрд╕реЗ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд▓реЗрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ (рд▓реВрдк рдХреЗ for рдПрдХ рдФрд░ "+1")ред

 public class Torrent { public string Name; public int PieceLength; public char[] Hash; public List<LostFile> Files; public string FileName; public bool CheckHash(int index, FileInfo fileOnDisk) {} } 

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╣реИрд╢ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рдЯреЛрд░реЗрдВрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдЬрд╛рдирддреЗ рд╣реИрдВ

 LostFile checkingFile = this.Files[index]; if (checkingFile.Length < this.PieceLength * 2 - 1) return false; 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╣реИрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд░реЗрдВред рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗрдВрдЧреЗ рдЬрд┐рдирдХреА рд▓рдореНрдмрд╛рдИ PieceLength * 2 - 1 рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╣рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИрдВ:
  1. рдбрд┐рд╕реНрдХ рдкрд░ рдкрдбрд╝реЛрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;
  2. рд╣реИрд╢ рдЪрдВрдХ рдХреА рд▓рдВрдмрд╛рдИ рд╢рд╛рдпрдж рд╣реА рдХрднреА 2-4 рдПрдордмреА рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд▓рд╕ рджреЗрддрд╛ рд╣реИ - рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдордп рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдбрд┐рд╕реНрдХ рдкрд░ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдереЗ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдирд╛ рдерд╛ - рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЯреБрдХрдбрд╝рд╛ рдЦреЛрдЬрдирд╛ред рдЖрдЗрдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рджреВрд░ рд╣рдЯреЗрдВ рдФрд░ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рдорд╕реНрдпрд╛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдЧрдгрд┐рдд рдХреА рдУрд░ рдореБрдбрд╝реЗрдВред

рдЬрдм рдХреЛрдИ рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдлрд╛рдЗрд▓реЗрдВ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╣реИрд╢ рдХреЛ рдХреНрд░рдо рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдлрд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдлрд┐рд░ рдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд▓реЗ рдЙрдкрд▓рдмреНрдз рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреМрди рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ рд▓реЗрдирд╛ рд╣реИ рдФрд░ рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдЗрди рджреЛ рдЕрдВрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ firstChunkNumber рдЪрд░ рдореЗрдВ рдкрд╣рд▓реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ, рдФрд░ рдмрд╛рдЗрдЯреНрд╕ bytesOverhead - рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрд░рдВрдн рд╕реЗ рд▓реЗрдХрд░ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреА рд╢реБрд░реБрдЖрдд рддрдХ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рдмрд╛рдж рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдЖрдХреГрддрд┐ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

 long start = 0; long firstChunkNumber = 0; long bytesOveload = checkingFile.BeginFrom % this.PieceLength; if (bytesOveload == 0) //        { start = checkingFile.BeginFrom; firstChunkNumber = checkingFile.BeginFrom / this.PieceLength; } else { firstChunkNumber = checkingFile.BeginFrom / this.PieceLength + 1; start = firstChunkNumber * this.PieceLength - checkingFile.BeginFrom; } 




рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ "рдорд╛рдорд▓реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЯреБрдХрдбрд╝рд╛ рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реИ рдЬрдм рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдЯреБрдХрдбрд╝рд╛ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ?" рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред

рдЕрдм, рдЯреБрдХрдбрд╝реЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬрд╛рдирдХрд░, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдзрд╛рд░ рд╕реЗ рдЗрд╕рдХрд╛ рд╣реИрд╢ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

 char[] hashInTorrent = new char[20]; // 20 -   SHA1   Array.Copy(this.Hash, firstChunkNumber * 20, hashInTorrent, 0, 20); 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рд╣реИрд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 char[] fileHash = new char[this.PieceLength]; using (BinaryReader fs = new BinaryReader(new FileStream(fileOnDisk.FullName, FileMode.Open))) { using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) { byte[] piece = new byte[this.PieceLength]; fs.BaseStream.Position = start; fs.Read(piece, 0, this.PieceLength); fileHash = Encoding.GetEncoding(437).GetString(sha1.ComputeHash(piece)).ToCharArray(); } } 

рд╡реИрд╕реЗ, рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП, Equals() рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ:

 for (int i = 0; i < fileHash.Length; i++) { if (fileHash[i] != hashInTorrent[i]) return false; } 

рдЙрддреНрд╕рд╛рд╣рд┐рдд рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдХрд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
CheckHash
 public bool CheckHash(int index, FileInfo fileOnDisk) { LostFile checkingFile = this.Files[index]; if (checkingFile.Length < this.PieceLength * 2 - 1) return false; long start = 0; long firstChunkNumber = 0; long bytesOveload = checkingFile.BeginFrom % this.PieceLength; if (bytesOveload == 0) { start = checkingFile.BeginFrom; firstChunkNumber = checkingFile.BeginFrom / this.PieceLength; } else { firstChunkNumber = checkingFile.BeginFrom / this.PieceLength + 1; start = firstChunkNumber * this.PieceLength - checkingFile.BeginFrom; } char[] hashInTorrent = new char[20]; Array.Copy(this.Hash, firstChunkNumber * 20, hashInTorrent, 0, 20); char[] fileHash = new char[this.PieceLength]; using (BinaryReader fs = new BinaryReader(new FileStream(fileOnDisk.FullName, FileMode.Open))) { using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) { byte[] piece = new byte[this.PieceLength]; fs.BaseStream.Position = start; fs.Read(piece, 0, this.PieceLength); fileHash = Encoding.GetEncoding(437).GetString(sha1.ComputeHash(piece)).ToCharArray(); } } for (int i = 0; i < fileHash.Length; i++) if (fileHash[i] != hashInTorrent[i]) return false; return true; } 

рдЗрд╕ рдЕрджреНрднреБрдд рдиреЛрдЯ рдкрд░, рддрд░реАрдХреЛрдВ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдХрд╣рд╛рдиреА рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕ рд░рдЪрдирд╛ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рдХрд╣рд╛рдиреА рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреА рд░рдЪрдирд╛ рдХреЛ рдЬрдирддрд╛ рдХреА рдЕрджрд╛рд▓рдд рдореЗрдВ рд▓рд╛рддрд╛ рд╣реВрдВ, рдЬреЛ рдКрдкрд░ рд▓рд┐рдЦреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо



рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА C # рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдмрд╣реБрдд рд╕рдирдХреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ .NET 2.0 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ: рдзрд╛рд░ рдбреНрд░рд╛рдЗрд╡ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдбреНрд░рд╛рдЗрд╡ рдХреА рдЬрдбрд╝ рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕ рд╕реАрдорд╛ рдХрд╛ рдХрд╛рд░рдг `SearchOption.AllDirectories` рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ рдЬрдм рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд░реАрд╕рд╛рдпрдХрд▓ рдмрд┐рди рдпрд╛` рд╕рд┐рд╕реНрдЯрдо рд╡реЙрд▓реНрдпреВрдо рд╕реВрдЪрдирд╛` (рдпрджрд┐ рдЬрд╛рдирдХрд╛рд░ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдпрд╣ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдБрдЧрд╛) рдЬреИрд╕реЗ рдмрдВрдж рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЧрдВрддрд╡реНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдореЙрдбрд▓ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рддрд╛рд░реНрдХрд┐рдХ)ред

рдЕрдЧрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ - рдбрд┐рд╕реНрдХ рдкрд░ .torrent рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред



рд╕реНрдХреИрдирд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддреАрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ (рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде) рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕реНрдХреИрдирд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВред

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред рдпрд╣ рдЕрднреА рднреА рдХрдо рд╣реИ: 10 рдмрдбрд╝реА рдЯреЛрд░реЗрдВрдЯ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рднреА рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣реИрд╢ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдХреЗ рдХрд╛рд░рдг рдЫреЛрдЯреА рдлрд╛рдЗрд▓реЗрдВ (2 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╕реЗ рдХрдо) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдирдВрдмрд░ рдХреЗ рддрд╣рдд рдХреЗрд╡рд▓ рдПрдХ рдЯреБрдХрдбрд╝рд╛ firstChunkNumber ред рдЕрдм рддрдХ, рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЛрдЬрдирд╛рдПрдВ рднреА рд╣реИрдВред

рдпрджрд┐ рд╡реЗ рдбрд┐рд╕реНрдХ рдХреА рдЬрдбрд╝ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЦреЛрдЬ рди рдХрд░реЗрдВред
рдирдХрд▓ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлреНрд░реАрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред

рдЪреВрдБрдХрд┐ рдпрд╣ 4fun рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣рд╛рдБ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдереЛрдбрд╝реА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рддрдп рдХреА рдЧрдИ рдереАрдВ, рдЗрд╕рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЫрд┐рдкрд╛рдирд╛ рд╣реИ, рдЫрд┐рдкреЗ рд╣реБрдП рдХреАрдбрд╝реЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдкрдиреЗ рдПрдХрдорд╛рддреНрд░ рдЬреЛрдЦрд┐рдо рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдк рдЬреАрдереВрдм рдкрд░ рд╕реНрд░реЛрдд рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред GPLv2 рджреНрд╡рд╛рд░рд╛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмреЗрдирдХреЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рдПрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд (рдореЗрд░реЗ рдкрд╛рд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИ , рдпрд╣ рдПрдХ рд╕рдмрдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ)ред

рдЙрди рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдзреИрд░реНрдп рджрд┐рдЦрд╛рдпрд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдд рддрдХ рдкрдврд╝рд╛ред рдЕрдкрдиреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢реА рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╣рд╛рдпрддрд╛ рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреЛрдб рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕реНрд░реЛрдд: BitTorrentSpecification

UPD1ред рдЪрд░реНрдЪрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрдХрд░ рдореМрдЬреВрджрд╛ рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЛ рди рддреЛрдбрд╝рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ (рдлрд┐рд▓реНрдореЛрдВ рдФрд░ рдбрд┐рд╕реНрдХреЛрдЧреНрд░рд╛рдлреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреЗ рдЕрдВрджрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд╣рд╛рд░реНрдбрд▓рд┐рдВрдХ рдмрдирд╛рдПрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

UPD2ред рдпрджрд┐ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╛ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдЗрдЪреНрдЫрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдореБрджреНрджреЗ рдЯреНрд░реИрдХрд░ рдореЗрдВ рдЧреАрдердм рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВред

Source: https://habr.com/ru/post/In150608/


All Articles