
рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдореЗрд░рд╛ рдХрд╛рдо рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ "рд╕рд░реНрд╡рд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ" рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдХреБрдЫ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд░реНрдлрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдореИрди'рдУрд╡ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░реНрд╡рд░-рдЬреИрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╕рдм рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд╣реИред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╕реЗ, рдЖрдк рдЕрдкрдиреЗ рдХреМрд╢рд▓ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕реБрдзрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдЬрдм рдореИрдВ рдЕрдВрдд рдореЗрдВ рджрд┐рдирдЪрд░реНрдпрд╛ рд╕реЗ рдХрд╛рдо рд╕реЗ рдКрдм рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдиреМрдХрд░реА рдЦреЛрдЬ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдХрд┐ рдореИрдВ рдмрд╛рдЬрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдмреБрд░рд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛, рдЕрдЪрд╛рдирдХ, рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ ... рд╡рд┐рд╖рдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдиреМрдХрд░реА рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: "рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреЛ рдмреНрдпрд╛рдЬ рджреЗрдЧрд╛ред" рдРрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдпрд╛ред рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд C ++ рдореЗрдВ рд╡реЗрдмрд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдирд╛ рд╣реИ; рд╕реНрдкрд╖реНрдЯ рд╣реИ ...
рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╕реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд▓реЗрдирд╛ рдФрд░ рдЗрд╕реЗ Google рдореЗрдВ рдЪрд▓рд╛рдирд╛, рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдореАрдХреНрд╖рд╛рдПрдБ
рдорд┐рд▓реАрдВ рдХрд┐
RSDN рдлреЛрд░рдо рдкрд░ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред рдХрд╛рд░реНрдп рдореЗрд░реЗ рдореЗрд▓рд░ рдореЗрдВ рдПрдХ рд╕реЗ рдПрдХ рдЭреВрда рдмреЛрд▓ рд░рд╣рд╛ рдерд╛ред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХреЗ 4 рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЬрдЧрд╣реЛрдВ рдкрд░ рдкрдврд╝рд╛ рдЧрдпрд╛ рдФрд░ рдЖрдЬрдорд╛рдпрд╛ рдЧрдпрд╛ред рдпрд╣ рдПрдХ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдмрди рдЧрдпрд╛, рдЕрд░реНрдерд╛рддреН рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рдиред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдХрд┐рд╕ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рднрд░реНрддреА рдПрдЬреЗрдВрд╕реА рд╕реЗ рдЖрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреА рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдЖрд▓реЗрдЦ рдЙрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдПрдкреАрдЖрдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдорд┐рд▓реЗ рд╣реИрдВред рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ WebServer рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреВрдВрдЧрд╛, рдкреНрд░рд╛рдкреНрдд "рд╢рд┐рд▓реНрдк" рдХрд╛ рдПрдХ рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдЦ "рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ" рд╕рд░реНрд╡рд░ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдРрд╕реЗ рд▓реЛрдЧ рдЬреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ (рди рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ) рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЦрд╝реБрд╢реА рд╣реЛрдЧреА рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рд╕реЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рджрд╛рдврд╝реА рд╡рд╛рд▓реЗ" рд╕рд░реНрд╡рд░-рд▓реЗрдЦрдХреЛрдВ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рди рдХреЗрд╡рд▓ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ ...
рдПрдкреАрдЖрдИ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди
рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдирддреАрдЬрд╛ рдерд╛, рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдкреАрдЖрдИ * рдирд┐рдХреНрд╕, рд╡рд┐рдВрдбреЛрдЬ рдПрдкреАрдЖрдИ (рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗрдЦрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ), рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░ рдЬреИрд╕реЗ рдмреВрд╕реНрдЯ.рдЖрд╕рд┐рдпреЛ рдФрд░ рд▓рд┐рдмрд╡реЗрдВрдЯред
рдмрд░реНрдХрд▓реЗ рд╕реЙрдХреЗрдЯ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ, рдкреЛрд░реНрдЯреЗрдмрд▓ рддрдВрддреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рд╣реИред рддреЛ рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рд╕реЙрдХреЗрдЯ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реАрдм рд╣реИ, рдФрд░ рдХреБрдЫ рдмрдВрдж рдЕрд▓рдорд╛рд░реА рдореЗрдВ; рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (Windows - WSAStartup / WSACleanup), рдХреБрдЫ рдирд╣реАрдВ; рдХрд╣реАрдВ рди рдХрд╣реАрдВ, рд╕реЙрдХреЗрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЗрдВрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдХрд╣реАрдВ, рд╕реЙрдХреЗрдЯ рдФрд░ рдЕрдиреНрдп рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреИрд╕реЗ рдХрд┐ pImpl рдФрд░ рдЕрдиреНрдп рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╣реА рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдЕрдХреНрд╕рд░ рдпрд╣ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпреЗ рд╕рднреА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░рд┐рдпреЛрдВ рдореЗрдВ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВ рдЬреИрд╕реЗ
рдмреВрд╕реНрдЯ.рдЖрд╕рд┐рдпреЛ ,
рд▓рд┐рдмреЗрд╡реЗрдВрдЯ рдФрд░
рд▓рд╛рдЗрдХ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреАрдЖрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:
- рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ
- рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЛ рдмрд╛рдВрдзреЗрдВ
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╕реЙрдХреЗрдЯ рдХреЛ рд╕реБрдиреЗрдВ
- рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ
- рд╕реЙрдХреЗрдЯ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм
рдкрд╛рдВрдЪрд╡реЗрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдмрд┐рдВрджреБ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдХрдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реЙрдХреЗрдЯ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдХрдИ рддрдВрддреНрд░ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЪрдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдореВрд▓ рд░реВрдк рд╕реЗ, рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рдлрд╛рдпрджреЗ рдирд╣реАрдВ рд╣реИрдВред
- WSAAsyncSelect - рдПрдХ рд╕реЙрдХреЗрдЯ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдПрдХ рд╡рд┐рдВрдбреЛ рдХрддрд╛рд░ рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рддреЗрдЬреА рд╕реЗ рдирд╣реАрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
- WSAEventSelect рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдИрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдЙрдкрдХрд░рдгред рдпрд╛рдиреА рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рде рд╕реИрдХрдбрд╝реЛрдВ рд╕реЗрд╡рд┐рдд рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди / рд╡рд┐рдХрд╛рд╕ рдЧрддрд┐ рдорд╛рдирджрдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рддрдВрддреНрд░ рд╣реИред
- WSAEventSelect рдХреА рддреБрд▓рдирд╛ рдореЗрдВ I / O рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рдирд╛ рдПрдХ рддреЗрдЬрд╝ рддрдВрддреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рднреА рд╣реИред
- I / O рдкреВрд░реНрдг рдкреЛрд░реНрдЯ - рдЙрдЪреНрдЪ-рд▓реЛрдб рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред
рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХ рд╣реИ - "рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╡рд┐рдВрдбреЛрдЬ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред"
рдЕрдм, рдпрджрд┐ рдЖрдк * рдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдИрд╡реЗрдВрдЯ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдореВрд╣ рднреА рд╣реИ:
- рд╡рд╣реА рдЪрдпрдиред рдФрд░ рдлрд┐рд░, рдЙрдирдХреА рднреВрдорд┐рдХрд╛ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рд╣реИред рдпрд╣ рднреА рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ (рд░рд┐рдЯрд░реНрди рдХрдВрдЯреНрд░реЛрд▓) рдЬрдм рдХрд┐рд╕реА рднреА рд╕реЙрдХреЗрдЯ рдкрд░ рдХреЛрдИ рдШрдЯрдирд╛ рдШрдЯрддреА рд╣реИ, рддреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдиреЗ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рдХрд┐рд╕ рд╕реЙрдХреЗрдЯ рдореЗрдВ рд╣реБрдИред рд╕рд╛рд░рд╛рдВрд╢: рдПрдХ рдСрдкрд░реЗрд╢рди рджреЗрдЦреЗ рдЧрдП рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдкреВрд▓ рдореЗрдВ рдПрдХ рд░рди рд╣реИред
- рдкреЛрд▓ рдПрдХ рддреЗрдЬрд╝ рддрдВрддреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- epoll (рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо) рдФрд░ kqueue (FreeBSD) рд▓рдЧрднрдЧ рдПрдХ рд╣реА рддрдВрддреНрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдордВрдЪреЛрдВ рдореЗрдВ рдЙрдЧреНрд░ FreeBSD рдкреНрд░рд╢рдВрд╕рдХ рдмрд╣реБрдд рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ kqueue рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рд╣рдо рдкрд╡рд┐рддреНрд░ рдпреБрджреНрдзреЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдирд╣реАрдВ рджреЗрдВрдЧреЗ ... рдЗрди рддрдВрддреНрд░реЛрдВ рдХреЛ рдореБрдЦреНрдп рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм * nix рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ред рдпрджрд┐ рд╣рдо рдЙрдирдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЙрд╕рдХреА рдЧрд░рд┐рдорд╛ рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдХреЗрд╡рд▓ рдЙрди рд╕реЙрдХреЗрдЯреНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдХреБрдЫ рд╣реБрдЖ рд╣реИ рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдм рдХреБрдЫ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ рдФрд░ рдХрд╣рд╛рдВ рд╣реБрдЖред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рддрдВрддреНрд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕реЗрд╡рд┐рдд рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдФрд░ рдЫреЛрдЯреЗ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рд╣реИрдВ:
- Sendfile (Linux) рдФрд░ TransmitFile (Windows) рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП "рдФрд░" рдЬрд╣рд╛рдБ "рд╕реЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред HTTP рд╕рд░реНрд╡рд░ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдЬрдм рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрдлрд░ рдЖрд╡рдВрдЯрди рдФрд░ рд░реАрдб / рд░рд╛рдЗрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
- aio - рдЖрдкрдХреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд╛рдо рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рд╢рд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрдлрд░ рдмрддрд╛рдПрдВ, рдЗрд╕реЗ рдЗрд╕ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдЖрдк рд╕рд┐рдЧреНрдирд▓ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗ (рдЗрд╕реА рддрд░рд╣ рд░реАрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде)ред
- Neigl рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдПрдХ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЫреЛрдЯреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдмрдлрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рджреЗрд░реА рдХреЗ рдмрд┐рдирд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдЬреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рдХреЛ рдмрдлрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЯреАрд╕реАрдкреА рдлреНрд░реЗрдо рдкрд░ рднреЗрдЬрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк TCP_CORK рдЬреИрд╕реЗ рд╕реЙрдХреЗрдЯ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
- рдФрд░ рд╣рд╛рдВ, рдЧреИрд░-рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕реЙрдХреЗрдЯред рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ ...
- рд░рд╛рдЗрдЯрд╡реЗ (nix) (рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рдорд╛рди WSA рдлрд╝рдВрдХреНрд╢рдВрд╕) рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рднреА рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдмрдлрд╝рд░реНрд╕ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ HTTP рдкреИрдХреЗрдЯ рд╣реЗрдбрд░ рдФрд░ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝рд╛ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрд╕реА рд╕рдордп рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдмрдЪрдд рд╣реЛрддреА рд╣реИред
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬреЛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмреВрд╕реНрдЯ.рдЖрд╕рд┐рдпреЛ рдФрд░ рд▓рд┐рдмрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред boost.asio рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, libevent рдПрдХ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рд╕рд┐рдХ рд╣реИред
рдПрдкреЛрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдиреЗрдЯрд╡рд░реНрдХ рдИрд╡реЗрдВрдЯреНрд╕, рдкреЛрд▓, рд╕реЗрд▓реЗрдХреНрдЯ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рднреА рддрдВрддреНрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣рд╛рдБ рдЕрднреА рднреА рдХрдИ рдЕрдиреНрдп рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВред
рдмрд╣реБрд╕реНрддрд░реАрдп рд╕рд░реНрд╡рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЬреЛ рд▓реЛрдЧ рдПрдХ рдмрд╛рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдпрд╛ рдЫрджреНрдо-рдпреБрджреНрдз рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ "рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░" рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд░рдгрдиреАрддрд┐ "рд╡рди рдХрдиреЗрдХреНрд╢рди - рд╡рди рдереНрд░реЗрдб" рдХреЛ рдЪреБрдирд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкрдХреНрд╖ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкреНрд▓рд╕ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реИред рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ: рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрди, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдПрдХреНрд╢рди (рдХреЛрдб, рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЪреМрд░рд╛рд╣реЗ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди, рд╡рд┐рдХрд╛рд╕ рдХреА рд╕рд╛рджрдЧреА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░рдгрдиреАрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЗрд╖реНрдЯрддрдо рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд╣реИрдВ - рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ / рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдПрдХ рд╣реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рдеред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╢реНрд░рдорд┐рдХ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЦреБрдж рдХреЗ рд▓рд┐рдП, рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЛ рдмрд╛рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ / рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдПрдХ рдереНрд░реЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрди рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛ рдФрд░ рд╢рд╛рдорд┐рд▓ рдереЗ: рд╢реНрд░рд╡рдг рдзрд╛рд░рд╛ рдФрд░ рдореБрдЦреНрдп рдПрдХред рд╢реНрд░рд╡рдг рдзрд╛рд░рд╛ - рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╡реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░рдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдзрд╛рдЧрд╛ - рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рд╕рд╡рд╛рд▓ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рд░реБрдЪрд┐ рдереА, рдЬреЛ рдПрдкреЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдиреЗрдЯрд╡рд░реНрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рдерд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рдереА рдХрд┐ рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдПрдкреЛрд▓ рджреНрд╡рд╛рд░рд╛ рдореЙрдирд┐рдЯрд░ рдХреА рдЧрдИ рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ (рд╡рд░реНрдХрд░реНрд╕) рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрддрд╛рд░ рд╕реЗ рдЧреБрдЬрд░рдирд╛ред рдпрд╛рдиреА рдПрдХ рдереНрд░реЗрдб рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдХреЗрдЯ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рджреЛрдиреЛрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдЖрдЧрдорди рдФрд░ рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдПрдХ рдИрд╡реЗрдВрдЯ рдорд┐рд▓рд╛, рдЗрд╕реЗ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦреЗрдВ, рд╡рд░реНрдХрд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛, рд╡рд░реНрдХрд░ рдереНрд░реЗрдбреНрд╕ рдиреЗ рдПрдХ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдПрдкреЛрд▓, рдЬреЛрдбрд╝рд╛, рдкрдврд╝рд╛, рд▓рд┐рдЦрдирд╛ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд╡рд▓реЛрдХрди рдХрд┐рдП рдЧрдП рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдкреВрд▓ рдХреЗ рдХрд░реАрдмред рдирд┐рд░реНрдгрдп рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛, рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдмреЗрд╢рдХ, рд░реАрдбрд┐рдВрдЧ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдиреЗрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдШрдЯрд╛рддреЗ рд╕рдордпред рдХрдИ рд╕реЙрдХреЗрдЯ рдХреНрд▓реЛрдЬрд░ рдИрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЦреЛ рдЧрдП рдереЗред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЧрдИ рдФрд░ рдЕрдЬреАрдм рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмреВрдБрджреЗрдВ рдереАрдВред рдЧрд┐рд░ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░рдг рд╕реЗ рдереЗред рдПрдкреЛрд▓ рдШрдЯрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╕рдВрдХреЗрддрдХ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдерд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдИрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдХреНрд░рдо рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛, рдЗрд╕ рдХрд╛рд░рдг рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдзреА рд╣реБрдИ рд╡рд╕реНрддреБ рдкрд╣рд▓реЗ рд╣реА рд╣рдЯрд╛ рджреА рдЧрдИ рдереА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рддреНрд░ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдИрд╡реЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рд╕рддреНрд░ рдХреЗ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рдФрд░ рдХрддрд╛рд░ рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдИрд╡реЗрдВрдЯ рдерд╛ред рдкрд╣рд▓реЗ рд╕реЗ рдЯреВрдЯреЗ рд╣реБрдП рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ред рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ "рд░реЗрдХ рдкрд░" рдХреБрдЫ рдРрд╕рд╛ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рд░рдгрдиреАрддрд┐ рдереА, рдЬрд┐рд╕реЗ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛: рдПрдкреЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп рд╢реНрд░рд╡рдг рдзрд╛рд░рд╛ рдХреЗрд╡рд▓ рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдХреЗрдЯ рдХреА рдШрдЯрдирд╛рдУрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреА рд╣реИ, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░, рдпрджрд┐ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрдиреЗрдХреНрд╢рди рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ; рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдЗрд╕ рдХрддрд╛рд░ рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕реЙрдХреЗрдЯ рдХреЛ рдЙрдирдХреЗ рдПрдкреЛрд▓ рд╕реЗрдЯ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рд╡реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдЙрдирдХреЗ рдПрдкреЛрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдкреЛрд▓ рдореЗрдВ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ, рдбреЗрдЯрд╛ рдЖрдЧрдорди, рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ, рд╕рдорд╛рдкрди (рдПрдкреЛрд▓ рд╕реЗ рд╡рд┐рд▓реЛрдкрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рд╕реНрддрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣реИрдВрдбрд▓ рдмрдВрдж рд╣реЛрддрд╛ рд╣реИ) ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрдЧрдарди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рдХрддрд╛рд░ рдХреА рд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо рд╣реИред рдПрдХ рдУрд░, рдХреЗрд╡рд▓ рд╢реНрд░рд╡рдг рдзрд╛рд░рд╛ рд╣реА рдЗрд╕ рдХрддрд╛рд░ рдХреЛ рд▓рд┐рдЦрддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдУрд░, рдкреНрд░рд╛рдкреНрдд рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдХрдо рд╕рдорд╕реНрдпрд╛ред рдпрд╣ рдПрдкреЛрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рддреНрд░ рд╡рд╕реНрддреБ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрдВрдзрди рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╕рдорд╛рдзрд╛рди: рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдХреБрдВрдЬреА рдПрдХ рд╕реЙрдХреЗрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рдбреЗрдЯрд╛ рдПрдХ рд╕рддреНрд░ рд╡рд╕реНрддреБ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдм рдПрдХ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ, рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдкреЛрд▓ рдШрдЯрдирд╛ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдЬрдм, рдХреБрдЫ рддрд░реНрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдЙрдкрд▓рдмреНрдз рд╣реИ)ред
рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реА # / рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреА рд╢реИрд▓реА рдореЗрдВ (рдШреЛрд╖рдгрд╛рдУрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛), рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдб рдХреА 1800 рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рдереАрдВред рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреНрдпреВрдирддрдо рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ GET / HEAD рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ HTTP рд╣реЗрдбрд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдиреНрдпреВрдирддрдо рд╣реИред рд╡рд╣ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ "рдХрд┐рдХ" рдерд╛ред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рд░реБрдЪрд┐ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдХрдиреЗрдХреНрд╢рди рдФрд░ рд╕рддреНрд░реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ (рдПрдХ рд╕рддреНрд░ рдХреЛ рдХрдиреЗрдХреНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рддрд╛рд░реНрдХрд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
рдЗрд╕ рд░рд╛рдХреНрд╖рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд┐рдпрд╛, рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛:
class TCPServer : private Common::NonCopyable { public: TCPServer(InetAddress const &locAddr, int backlog, int maxThreadsCount, int maxConnectionsCount, UserSessionCreator sessionCreator); private: typedef std::tr1::shared_ptr<Common::IDisposable> IDisposablePtr; typedef std::vector<IDisposablePtr> IDisposablePool; Private::ClientItemQueuePtr AcceptedItems; IDisposablePool Threads; };
рдпрд╣ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╕рд░реНрд╡рд░ рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рд▓рд┐рдЦрдирд╛ рдерд╛ред рдпрд╣ рд╡рд░реНрдЧ рдХреЗрд╡рд▓ рдХрдИ рд╕реВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ: рд╢реНрд░реЛрддрд╛ рдФрд░ рдХрдИ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛, рдФрд░ рдЙрдирдХреЗ рдзрд╛рд░рдХ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди TCPServer::TCPServer(InetAddress const &locAddr, int backlog, int maxThreadsCount, int maxConnectionsCount, UserSessionCreator sessionCreator) : AcceptedItems(new Private::ClientItemQueue(backlog)) { int EventsCount = maxConnectionsCount / maxThreadsCount; for (int i = 0 ; i < maxThreadsCount ; ++i) { Threads.push_back(IDisposablePtr(new Private::WorkerThread( EventsCount + (i <= maxThreadsCount - 1 ? 0 : maxConnectionsCount % maxThreadsCount), AcceptedItems ))); } Threads.push_back(IDisposablePtr(new Private::ListenThread(locAddr, backlog, AcceptedItems, sessionCreator))); }
рдорд╣рд╛рди рднреА рдирд╣реАрдВред рджреЛрдиреЛрдВ рд╡рд░реНрдЧ рд╕рдорд╛рди рд╣реИрдВ
рд╕реБрдирдиреЗ рдХреА рдзрд╛рд░рд╛ class ListenThread : private TCPServerSocket , public Common::IDisposable { public: ListenThread(InetAddress const &locAddr, int backlog, ClientItemQueuePtr acceptedClients, UserSessionCreator sessionCreator) : TCPServerSocket(locAddr, backlog) , AcceptedClients(acceptedClients) , SessionCreator(sessionCreator) , Selector(1, WaitTimeout, std::tr1::bind(&ListenThread::OnSelect, this, std::tr1::placeholders::_1, std::tr1::placeholders::_2)) { Selector.AddSocket(GetHandle(), Network::ISelector::stRead); } private: enum { WaitTimeout = 100 }; ClientItemQueuePtr AcceptedClients; UserSessionCreator SessionCreator; SelectorThread Selector; void OnSelect(SocketHandle handle, Network::ISelector::SelectType selectType) {
рдФрд░
рдХрд╛рдо рдкреНрд░рд╡рд╛рд╣ class WorkerThread : private Common::NonCopyable , public Common::IDisposable { public: WorkerThread(int maxEventsCount, ClientItemQueuePtr acceptedClients) : MaxConnections(maxEventsCount) , AcceptedClients(acceptedClients) , Selector(maxEventsCount, WaitTimeout, std::tr1::bind(&WorkerThread::OnSelect, this, std::tr1::placeholders::_1, std::tr1::placeholders::_2), SelectorThread::ThreadFunctionPtr(new SelectorThread::ThreadFunction(std::tr1::bind( &WorkerThread::OnIdle, this)))) { } private: enum { WaitTimeout = 100 }; typedef std::map<SocketHandle, ClientItemPtr> ClientPool; unsigned MaxConnections; ClientItemQueuePtr AcceptedClients; ClientPool Clients; SelectorThread Selector; void OnSelect(SocketHandle handle, Network::ISelector::SelectType selectType) {
рдЗрд╡реЗрдВрдЯ рдлрд╝реНрд▓реЛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
SelectorThread class SelectorThread : private EPollSelector , private System::ThreadLoop { public: using EPollSelector::AddSocket; typedef System::Thread::ThreadFunction ThreadFunction; typedef std::tr1::shared_ptr<ThreadFunction> ThreadFunctionPtr; SelectorThread(int maxEventsCount, unsigned waitTimeout, ISelector::SelectFunction onSelectFunc, ThreadFunctionPtr idleFunc = ThreadFunctionPtr()); virtual ~SelectorThread(); private: void SelectItems(ISelector::SelectFunction &func, unsigned waitTimeout, ThreadFunctionPtr idleFunc); };
ред рдпрд╣ рдзрд╛рдЧрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
EPollSelector class EPollSelector : private Common::NonCopyable , public ISelector { public: EPollSelector(int maxSocketCount); ~EPollSelector(); virtual void AddSocket(SocketHandle handle, int selectType); virtual void Select(SelectFunction *function, unsigned timeout); private: typedef std::vector<epoll_event> EventPool; EventPool Events; int EPoll; static int GetSelectFlags(int selectType); };
рд╕реНрд╡реАрдХреГрдд рдпреМрдЧрд┐рдХреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдПред
рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЗ рд╕реНрд░реЛрдд рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд┐рдо рд╕рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ
struct IUserSession { virtual ~IUserSession() {} virtual void Init(IConnectionCtrl *ctrl) = 0; virtual void Done() = 0; virtual unsigned GetMaxBufSizeForRead() const = 0; virtual bool IsExpiredSession(std::time_t lastActionTime) const = 0; virtual void OnRecvData(void const *buf, unsigned bytes) = 0; virtual void OnIdle() = 0; };
рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред Init рдФрд░ Done рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреНрд░рдорд╢рдГ рд╕рддреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред GetMaxBufSizeForRead рдХреЛ рдбреЗрдЯрд╛ рд░реАрдб рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рджреМрд░рд╛рди рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрддрдо рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд░реАрдб рдбреЗрдЯрд╛ OnRecvData рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╕рддреНрд░ рдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ IsExpiredSession рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред OnIdle рдХреЛ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рд╕рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдкреГрд╖реНрдарднреВрдорд┐ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЦреБрдж рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ
struct IConnectionCtrl { virtual ~IConnectionCtrl() { } virtual void MarkMeForClose() = 0; virtual void UpdateSessionTime() = 0; virtual bool SendData(void const *buf, unsigned *bytes) = 0; virtual bool SendFile(int fileHandle, unsigned offset, unsigned *bytes) = 0; virtual InetAddress const& GetAddress() const = 0; virtual SocketTuner GetSocketTuner() const = 0; };
IConnectionCtrl рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдиреЗрдЯрд╡рд░реНрдХ (SendData рдФрд░ SendFile рд╡рд┐рдзрд┐рдпреЛрдВ) рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХреЗ, рдЦреБрдж рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ (MarkMeForClose рдкрджреНрдзрддрд┐), рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ "рдЬреАрд╡рд┐рдд" рд╣реИ (UpdateSessionTime рдкрджреНрдзрддрд┐; рдЕрджреНрдпрддрди рд╕рдордп рдкрд░ рдЖрддрд╛ рд╣реИ; IsExpiredSession), рдПрдХ рд╣реА рд╕рддреНрд░ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди (GetAddress рдкрджреНрдзрддрд┐) рдФрд░ рд╕реЙрдХреЗрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯрдЯреНрдпреВрдирд░ рдСрдмреНрдЬреЗрдХреНрдЯ - рд╡рд░реНрддрдорд╛рди рдХрдиреЗрдХреНрд╢рди (GetSocketTuner рд╡рд┐рдзрд┐) рдХрд╛ рдкрддрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди HttpUserSession рд╡рд░реНрдЧ рдореЗрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛, HTTP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рд╕реЛрдЪрд╛; рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рддрдирд╛ рд▓рд┐рдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ :)
Libevent рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдкрд░рд┐рд╡рд╛рдж рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рднреА рдореЗрд░реЗ рд▓рд┐рдП рдкрд╕рдВрджреАрджрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдХрдИ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд▓рдЯрдХрд╛рдиреЗ, рдбреЗрдЯрд╛ рдФрд░ рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ, рдбреЗрдЯрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдирд┐рдореНрди-рд╕реНрддрд░ рдХреЗ рдХрд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдЪреНрдЪ-рд╕реНрддрд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднреА рд╣реИрдВред libevent рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд HTTP рд╕рд░реНрд╡рд░ рд╣реИ, рдЬреЛ рдЕрдиреБрд░реЛрдз рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рд╕рдорд╛рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдкреАрд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрдХреНрд░рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
- Event_base_new рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдХреБрдЫ рдореВрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ (рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓реАрдХреГрдд рднреА рд╣реИ - event_init)ред рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпреБрдЧреНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди event_base_free рд╣реИред
- Evhttp_new рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ HTTP рдЗрдВрдЬрди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред Evhttp_free рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреБрдЧреНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рдиред
- рдЖрдк рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рдлреНрд▓реИрдЧ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде evhttp_set_allowed_methods рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ GET рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛: evhttp_set_allowed_methods (Http, EVHTTP_REQ_GET), рдЬрд╣рд╛рдВ Http рдЪрд░рдг (2) рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИред
- Evhttp_set_gencb рдХреЙрд▓ рдХрд░рдХреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░реЗрдВред
- Evhttp_accept_socket рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ HTTP рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рд╕рдВрдмрджреНрдз рдХрд░реЗрдВред рдПрдХ рд╕реБрдирдиреЗ рд╡рд╛рд▓рд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рд╕реЙрдХреЗрдЯ / рдмрд╛рдЗрдВрдб / рд╕реБрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- Event_base_loop рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╡рд┐рдХрд▓реНрдк рд╣реИ - event_base_dispatchред event_base_loop рдХреЛ рд▓реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдВрддреНрд░реЛрдВ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдХреЙрд▓ рдЖрддрд╛ рд╣реИ, рдпрд╛ рдЬрдм рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕ рдкрд▓ рдореЗрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрд╣ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЪрдХреНрд░ рдХреЗ рдЬреАрд╡рди рдХрд╛рд▓ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
- рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рдЖрдк evbuffer_add_printf рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ evbuffer_add_file рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреБрдЫ рдмрдлрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЦреБрдж рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╕рдордп рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдирд╛ рди рднреВрд▓реЗрдВ) рдпрд╛ рдЕрдиреБрд░реЛрдз рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: evhttp_request :: output_bufferред рд╕рднреА рдЖрдХрд░реНрд╖рдг рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рдХрд╛рд░реНрдп рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдЙрд╕реА evbuffer_add_file рдкрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рддреБрд░рдВрдд рдирд┐рдпрдВрддреНрд░рдг рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдФрд░ рдлрд╝рд╛рдЗрд▓ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
рд╕рдм рдХреБрдЫ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдмрдврд╝рд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :: рдереНрд░реЗрдб рдпрд╛ рдЖрдкрдХрд╛ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд░реНрдЧ рдЬреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдХрд╛рдо рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╣реИ, рддреЛ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ libevent рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рдУрдВ рдкрд░ рдХреБрдЫ рдЖрд╡рд░рдг рд▓реЗ рд▓реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╡рд░рдгрдХреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддреНред рдкреВрд░реНрдг рдЪрд░рдг 1-5ред рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЪрдХреНрд░реЛрдВ рдХреЛ рдореЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЪрд░рдг 6. рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдЪрд░рдг 7 рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рд╕реБрдирдиреЗ рд╡рд╛рд▓рд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрдИ рд╡рд░реНрдХрд░ рдереНрд░реЗрдб рдкрд░ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдзрд╛рд░рд╛рдУрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЖрджрд┐рдо рд╣реИрдВ, рдореБрдЭреЗ C # / Java рд╢реИрд▓реА рдореЗрдВ рд▓рдЧрднрдЧ 200 рд▓рд╛рдЗрдиреЛрдВ рдХреА рдХреЗрд╡рд▓ GET рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдорд┐рд▓рд╛ред рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХреЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рдо рдореЗрдВ рдпрд╣ рдХрдореА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдЖрдирдиреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рд╖рдп рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд░рд┐рдгрд╛рдореА рд╕рд░реНрд╡рд░ рдереЛрдбрд╝рд╛ рддреЗрдЬрд╝ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЕрдВрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ ...
Libevent рдкрд░ рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ #include <event.h> #include <evhttp.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <vector> #include <iostream> #include <tr1/functional> #include <tr1/memory> #include "tcp_server_socket.h" #include "inet_address_v4.h" #include "thread.h" #include "command_line.h" #include "logger.h" #include "file_holder.h" namespace Network { namespace Private { DECLARE_RUNTIME_EXCEPTION(EventBaseHolder) class EventBaseHolder : private Common::NonCopyable { public: EventBaseHolder() : EventBase(event_base_new()) { if (!EventBase) throw EventBaseHolderException("Failed to create new event_base"); } ~EventBaseHolder() { event_base_free(EventBase); } event_base* GetBase() const { return EventBase; } private: event_base *EventBase; }; DECLARE_RUNTIME_EXCEPTION(HttpEventHolder) class HttpEventHolder : public EventBaseHolder { public: typedef std::tr1::function<void (char const *, evbuffer *)> RequestHandler; HttpEventHolder(SocketHandle sock, RequestHandler const &handler) : Handler(handler) , Http(evhttp_new(GetBase())) { evhttp_set_allowed_methods(Http, EVHTTP_REQ_GET); evhttp_set_gencb(Http, &HttpEventHolder::RawHttpRequestHandler, this); if (evhttp_accept_socket(Http, sock) == -1) throw HttpEventHolderException("Failed to accept socket for http"); } ~HttpEventHolder() { evhttp_free(Http); } private: RequestHandler Handler; evhttp *Http; static void RawHttpRequestHandler(evhttp_request *request, void *prm) { reinterpret_cast<HttpEventHolder *>(prm)->ProcessRequest(request); } void ProcessRequest(evhttp_request *request) { try { Handler(request->uri, request->output_buffer); evhttp_send_reply(request, HTTP_OK, "OK", request->output_buffer); } catch (std::exception const &e) { evhttp_send_reply(request, HTTP_INTERNAL, e.what() ? e.what() : "Internal server error.", request->output_buffer); } } }; class ServerThread : private HttpEventHolder , private System::Thread { public: ServerThread(SocketHandle sock, std::string const &rootDir, std::string const &defaultPage) : HttpEventHolder(sock, std::tr1::bind(&ServerThread::OnRequest, this, std::tr1::placeholders::_1, std::tr1::placeholders::_2)) , Thread(std::tr1::bind(&ServerThread::DispatchProc, this)) , RootDir(rootDir) , DefaultPage(defaultPage) { } ~ServerThread() { IsRun = false; } private: enum { WaitTimeout = 10000 }; bool volatile IsRun; std::string RootDir; std::string DefaultPage; void DispatchProc() { IsRun = true; while(IsRun) { if (event_base_loop(GetBase(), EVLOOP_NONBLOCK)) { Common::Log::GetLogInst() << "Failed to run dispatch events"; break; } usleep(WaitTimeout); } } void OnRequest(char const *resource, evbuffer *outBuffer) { std::string FileName; GetFullFileName(resource, &FileName); try { System::FileHolder File(FileName); if (!File.GetSize()) { evbuffer_add_printf(outBuffer, "Empty file"); return; } evbuffer_add_file(outBuffer, File.GetHandle(), 0, File.GetSize()); File.Detach(); } catch (System::FileHolderException const &) { evbuffer_add_printf(outBuffer, "File not found"); } } void GetFullFileName(char const *resource, std::string *fileName) const { fileName->append(RootDir); if (!resource || !strcmp(resource, "/")) { fileName->append("/"); fileName->append(DefaultPage); } else { fileName->append(resource); } } }; } class HTTPServer : private TCPServerSocket { public: HTTPServer(InetAddress const &locAddr, int backlog, int maxThreadsCount, std::string const &rootDir, std::string const &defaultPage) : TCPServerSocket(locAddr, backlog) { for (int i = 0 ; i < maxThreadsCount ; ++i) { ServerThreads.push_back(ServerThreadPtr(new Private::ServerThread(GetHandle(), rootDir, defaultPage))); } } private: typedef std::tr1::shared_ptr<Private::ServerThread> ServerThreadPtr; typedef std::vector<ServerThreadPtr> ServerThreadPool; ServerThreadPool ServerThreads; }; } int main(int argc, char const **argv) { if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { std::cerr << "Failed to call signal(SIGPIPE, SIG_IGN)" << std::endl; return 0; } try { char const ServerAddr[] = "Server"; char const ServerPort[] = "Port"; char const MaxBacklog[] = "Backlog"; char const ThreadsCount[] = "Threads"; char const RootDir[] = "Root"; char const DefaultPage[] = "DefaultPage"; // Server:127.0.0.1 Port:5555 Backlog:10 Threads:4 Root:./ DefaultPage:index.html Common::CommandLine CmdLine(argc, argv); Network::HTTPServer Srv( Network::InetAddressV4::CreateFromString( CmdLine.GetStrParameter(ServerAddr), CmdLine.GetParameter<unsigned short>(ServerPort)), CmdLine.GetParameter<unsigned>(MaxBacklog), CmdLine.GetParameter<unsigned>(ThreadsCount), CmdLine.GetStrParameter(RootDir), CmdLine.GetStrParameter(DefaultPage) ); std::cin.get(); } catch (std::exception const &e) { Common::Log::GetLogInst() << e.what(); } return 0; }
рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
boost.asio рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд╛рд▓реЗ рднреАред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рдирдЪрд░реНрдпрд╛ рдЫреБрдкрд╛рддреА рд╣реИред
рдореИрдВрдиреЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдкрд░ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ред рдореИрдВрдиреЗ рдмреВрд╕реНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб HTTP рд╕рд░реНрд╡рд░ред HTTP рд╕рд░реНрд╡рд░ 3 рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рд╕реА рдмрд╛рдд рдХрд░рдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ... рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, libevent рдХреЗ рд╡рд┐рдкрд░реАрдд, boost.asio HTTP рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рдорд╛рди рдХрд┐рд╕реА рднреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреАрд╕реАрдкреА рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЫрд┐рдкрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реЗрдбрд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTTP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреБрдж рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдиреАрдЪреЗ рдПрдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЗрдХреЛ рд╕рд░реНрд╡рд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ HTTP рд╣реЗрдбрд░ рдХреЛ рдкрд╛рд░реНрд╕ / рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрдо рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдПрдХ рдмрд╣реБ-рдкрд┐рд░реЛрдпрд╛ рд╕рд░реНрд╡рд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдгреЛрдВ рдХрд╛ рдХреНрд░рдо рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:
- рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рд╡рд╕реНрддреБрдУрдВ рдмрдирд╛рдПрдБ :: asio :: io_service рдФрд░ рдмрдврд╝рд╛рд╡рд╛ :: asio :: ip :: tcp :: рд╕реНрд╡реАрдХрд░реНрддрд╛ рд╡рд░реНрдЧред
- рдмреВрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ :: asio :: ip :: tcp :: resolver and boost :: asio :: ip :: tcp :: endpoint рд╕реНрдерд╛рдиреАрдп рдкрддреЗ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ рдЬрд┐рд╕рд╕реЗ рд╕реБрдирдиреЗ рд╡рд╛рд▓рд╛ рд╕реЙрдХреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдмрдВрдз рдЬрд╛рдПрдЧрд╛ред
- рдХреЙрд▓ рдХреЛ рдмрд╛рдВрдзреЗрдВ рдФрд░ рд╡рд░реНрдЧ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рд╡рд╕реНрддреБ рдкрд░ рд╕реБрдиреЗрдВ :: asio :: ip :: tcp :: рд╕реНрд╡реАрдХрд░реНрддрд╛ред
- рдХреБрдЫ рд╡рд░реНрдЧ "рдХрдиреЗрдХреНрд╢рди" рдмрдирд╛рдПрдВ; рдЙрд░реНрдл "рд╕рддреНрд░", рдЬрд┐рд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
- рдореИрд╕реЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдХрд░ рдХреЙрд▓ рдХрд░реЗрдВ :: asio :: io_service :: runред
рдФрд░ libevent рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЪрд░рдгреЛрдВ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдФрд░ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдмрдврд╝рд╛рд╡рд╛ :: asio :: io_service :: рд░рди рдкрджреНрдзрддрд┐ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
Echo server рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ boost.asio рдкрд░ #include <boost/noncopyable.hpp> #include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/thread.hpp> #include <boost/make_shared.hpp> #include <boost/bind.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/array.hpp> namespace Network { namespace Private { class Connection : private boost::noncopyable , public boost::enable_shared_from_this<Connection> { public: Connection(boost::asio::io_service &ioService) : Strand(ioService) , Socket(ioService) { } boost::asio::ip::tcp::socket& GetSocket() { return Socket; } void Start() { Socket.async_read_some(boost::asio::buffer(Buffer), Strand.wrap( boost::bind(&Connection::HandleRead, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred) )); } void HandleRead(boost::system::error_code const &error, std::size_t bytes) { if (error) return; std::vector<boost::asio::const_buffer> Buffers; Buffers.push_back(boost::asio::const_buffer(Buffer.data(), bytes)); boost::asio::async_write(Socket, Buffers, Strand.wrap( boost::bind(&Connection::HandleWrite, shared_from_this(), boost::asio::placeholders::error) )); } void HandleWrite(boost::system::error_code const &error) { if (error) return; boost::system::error_code Code; Socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, Code); } private: boost::array<char, 4096> Buffer; boost::asio::io_service::strand Strand; boost::asio::ip::tcp::socket Socket; }; } class EchoServer : private boost::noncopyable { public: EchoServer(std::string const& locAddr, std::string const& port, unsigned threadsCount) : Acceptor(IoService) , Threads(threadsCount) { boost::asio::ip::tcp::resolver Resolver(IoService); boost::asio::ip::tcp::resolver::query Query(locAddr, port); boost::asio::ip::tcp::endpoint Endpoint = *Resolver.resolve(Query); Acceptor.open(Endpoint.protocol()); Acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); Acceptor.bind(Endpoint); Acceptor.listen(); StartAccept(); std::generate(Threads.begin(), Threads.end(), boost::bind( &boost::make_shared<boost::thread, boost::function<void ()> const &>, boost::function<void ()>(boost::bind(&boost::asio::io_service::run, &IoService)) )); } ~EchoServer() { std::for_each(Threads.begin(), Threads.end(), boost::bind(&boost::asio::io_service::stop, &IoService)); std::for_each(Threads.begin(), Threads.end(), boost::bind(&boost::thread::join, _1)); } private: boost::asio::io_service IoService; boost::asio::ip::tcp::acceptor Acceptor; typedef boost::shared_ptr<Private::Connection> ConnectionPtr; ConnectionPtr NewConnection; typedef boost::shared_ptr<boost::thread> ThreadPtr; typedef std::vector<ThreadPtr> ThreadPool; ThreadPool Threads; void StartAccept() { NewConnection = boost::make_shared<Private::Connection, boost::asio::io_service &>(IoService); Acceptor.async_accept(NewConnection->GetSocket(), boost::bind(&EchoServer::HandleAccept, this, boost::asio::placeholders::error)); } void HandleAccept(boost::system::error_code const &error) { if (!error) NewConnection->Start(); StartAccept(); } }; } int main() { try { Network::EchoServer Srv("127.0.0.1", "5555", 4); std::cin.get(); } catch (std::exception const &e) { std::cerr << e.what() << std::endl; } return 0; }
рдкрд░реАрдХреНрд╖рдг
рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╢рд┐рд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ ...
рдЬрд┐рд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рдм рдХреБрдЫ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╡рд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реИрдкрдЯреЙрдк рд╣реИ рдЬрд┐рд╕рдореЗрдВ 4GB RAM рдФрд░ 2-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд▓рд╛ Ubuntu 12.04 рдбреЗрд╕реНрдХрдЯреЙрдк рдЪрд▓ рд░рд╣рд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд░рдЦреА:
sudo apt-get install apache2-utils
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:
ab -c 100 -k -r -t 5 "http://127.0.0.1:5555/test.jpg"
рд╕рднреА рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП, 4 рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП, 100 рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдиреЗрдХреНрд╢рди, 2496629 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рдФрд░ 5 рд╕реЗрдХрдВрдб рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдордп рдЕрдВрддрд░рд╛рд▓ред
рдкрд░рд┐рдгрд╛рдо:
рдПрдкреЛрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ 127.0.0.1 (рдзреИрд░реНрдп рд░рдЦреЗрдВ)
2150 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛
рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░: MyTestHttpServer
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /test.jpg
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 2496629 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рди рд╕реНрддрд░: 100
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп: 5.017 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 2150
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
рд░рдЦ-рд░рдЦрд╛рд╡ рдЕрдиреБрд░реЛрдз: 0
рдХреБрд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 5389312814 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 5388981758 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 428.54 [# / рд╕реЗрдХрдВрдб] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 233.348 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 2.333 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 1049037.42 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдореНрд╕ (рдПрдордПрд╕)
рдорд┐рди рдХрд╛ рдорддрд▓рдм рд╣реИ [] sd] рдорд╛рдзреНрдпрд┐рдХрд╛ рдЕрдзрд┐рдХрддрдо
рдХрдиреЗрдХреНрдЯ: 0 0 0.5 0 3
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: 74 226 58.2 229 364
рдкреНрд░рддреАрдХреНрд╖рд╛: 2 резрейрей ремрек. 141 резрекрез реиремрек
рдХреБрд▓: 77 226 58.1 229 364
Libevent рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ 127.0.0.1 (рдзреИрд░реНрдп рд░рдЦреЗрдВ)
1653 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛
рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /test.jpg
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 2496629 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рди рд╕реНрддрд░: 100
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп: 5.008 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 1653
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
Keep-Alive рдЕрдиреБрд░реЛрдз: 1653
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд: 4263404830 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 4263207306 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 330.05 [# / рд╕реЗрдХрдВрдб] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 302.987 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 3.030 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 831304.15 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдореНрд╕ (рдПрдордПрд╕)
рдорд┐рди рдХрд╛ рдорддрд▓рдм рд╣реИ [] sd] рдорд╛рдзреНрдпрд┐рдХрд╛ рдЕрдзрд┐рдХрддрдо
рдХрдиреЗрдХреНрдЯ: 0 53 223.3 0 1000
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: 3 228 275.5 62 904
рдкреНрд░рддреАрдХреНрд╖рд╛: реж резрез рекреи.рел рел ремрей реп
рдХреБрд▓: рей реи 3реж рекрез :.реп ремреи рез .ремрек
рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ 127.0.0.1 (рдзреИрд░реНрдп рд░рдЦреЗрдВ)
639 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛
рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /test.jpg
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 2496629 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рди рд╕реНрддрд░: 100
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп: 5.001 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 639
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
рд░рдЦ-рд░рдЦрд╛рд╡ рдЕрдиреБрд░реЛрдз: 0
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд: 1655047414 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 1654999464 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 127.78 [# / рд╕реЗрдХрдВрдб] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 782.584 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 7.826 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 323205.36 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдореНрд╕ (рдПрдордПрд╕)
рдорд┐рди рдХрд╛ рдорддрд▓рдм рд╣реИ [] sd] рдорд╛рдзреНрдпрд┐рдХрд╛ рдЕрдзрд┐рдХрддрдо
рдХрдиреЗрдХреНрдЯ: 0 0 1.1 0 4
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: 286 724 120.0 689 1106
рдкреНрд░рддреАрдХреНрд╖рд╛: 12 364 101.0 394 532
рдХреБрд▓: 286 724 120.0 689 1106
рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рд╣реИрдВред
| epoll | libevent | boost.asio |
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз | 2150 | 1653 | 639 |
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд (рдмрд╛рдЗрдЯреНрд╕) | 5389312814 | 4263404830 | 1655047414 |
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд (рдмрд╛рдЗрдЯреНрд╕) | 5388981758 | 4263207306 | 1654999464 |
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз [рд╕реЗрдХрдВрдб] (рдорддрд▓рдм) | 428.54 | 330.05 | 127.78 |
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп [рдПрдордПрд╕] (рдорддрд▓рдм) | 233,348 | 302,987 | 782,584 |
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░ [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХреА | 1,049,037.42 | 831,304.15 | 323,205.36 |
рдЭреВрда рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдЭреВрда, рдЭреВрда рдФрд░ рдЭреВрдаред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдХреА рдкрд╕рдВрдж рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЕрдиреНрдп рдорд╢реАрдиреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрджрд┐ рдкрд░ рдХрдИ рд░рди рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред
100 рд╕рдорд╛рдирд╛рдВрддрд░ рдХреНрд╡реЗрд░рд┐рдпрд╛рдБ - рдпрд╣ рдЫреЛрдЯреА рд╕реА рдкреНрд░рддреАрдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдРрд╕реА рдорд╛рдореВрд▓реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдмреЗрд╢рдХ, рдореИрдВ рд╣рдЬрд╛рд░реЛрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рдХрд╛рд░рдХ рд╣реИрдВред рдРрд╕рд╛ рдПрдХ рдХрд╛рд░рдХ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рде рдЦреБрд▓реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЖрдк getrlimit рдФрд░ setrlimit рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд┐рддрдиреЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд░рд┐рдкреНрд▓рд┐рдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ RLIMIT_NOFILE рдХреЗ рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде рдЧреЗрдЯрд▓рд┐рдорд┐рдЯ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдпреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ рдкреНрд░реЛрд╕реЗрд╕ 1024 рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрддрдо 4096 рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдЗрд╕ рдорд╛рдирджрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ... рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рддрджрдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдирдХреНрд╕ рдкрд░ рдмрдврд╝рддреЗ рд╕реЙрдХреЗрдЯ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд▓реЗрдЦ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд░реНрдгрди рд╣реИрдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдкрдиреА рд╡реЗрдмрд╕рд░реНрд╡рд░ рдХреЛ рдирдВрдЧреЗ рд╕реЙрдХреЗрдЯ рдкрд░ рд▓рд┐рдЦрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╢реИрддрд╛рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдорд╣рд╕реВрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпреЗ рдмрд╣реБрдд рд╡рд┐рд╡рд░рдг, рдПрдХ рд╕реНрдиреЛрдмреЙрд▓ рдХреА рддрд░рд╣, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд░реЛрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕реВрдЪрдирд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рд╛рдЗрдХрд┐рд▓ рдЙрджреНрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдмрд╣реБрдд рдкреНрдпрд╛рд░ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рддрдм рднреА рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЬрдм рдЖрдкрдХреЛ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдгреЛрдВ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░ рдХрд╛ рд╣реЛрдЧрд╛ред рд╕рд░реНрд╡рд░ред рдПрдкреЛрд▓ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рд╕реЗ рдЬреБрдбрд╝рд╛ рдХреЛрдб рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрджреНрдпреЛрдЧрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓рд╛рдирд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛, рдХреНрд░рдорд╢рдГ, рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рдирд┐рдпреЛрдЬрд┐рдд рд░рд┐рдЯрд░реНрди рднреА рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди "рдЬрд╝рдмрд░рджрд╕реНрдд рдЭреВрда"рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдКрдкрд░, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЦреБрд╢реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реА ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╢реБрджреНрдз рд╕реА рдореЗрдВ рдирд╣реАрдВ, рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рд╕реНрдЯрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рддрд┐рд░рд╕реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛редрдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рд╡рд╛рдж рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдмрди рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдПрдХ рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо, рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рдЫреБрдкрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛редрдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░рд╛рдп рдореЗрдВ, рдмрдврд╝рд╛рд╡рд╛ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрдИ рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рд╣реИред boost.asio рдиреЗрдЯрд╡рд░реНрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬрд╝реЛрдВ рд╕реЗ рдХрд╛рдлреА рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдЕрдиреБрднрд╡реА" рдХреА рд░рд╛рдп рд╕реБрдирдирд╛ рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рдПрдХ рдЙрдЪреНрдЪ рднрд╛рд░ рдХреЗ рд╕рд╛рдередрдЕрднреА рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдВрддреНрд░ рд╣реИрд▓рд┐рдирдХреНрд╕ (aio) рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдирдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ , рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА "рдирдВрдЧреЗ" рд╕реЙрдХреЗрдЯ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред рдПрд╕рд╡реАрдПрдирдореЗрдВ рдиреНрдпреВрдирддрдо рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдлрд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓рд╛ рд╕рднреА рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдХреЛрдб, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди!
рдЕрддрд┐рд░рдВрдЬрд┐рдд рдкреВрд░реНрдгрддрд╛рд╡рд╛рдж рдпрд╛ рддреЛ рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрддреНрдпрдзрд┐рдХ рджреЗрд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдЕрдкреНрд░рд╛рдкреНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред "рдкреАрдбрд╝рд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕" рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рджреВрд╕рд░рд╛ рд╕реБрдВрджрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рддреАрд╕рд░рд╛ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рджрд┐рдП рдЧрдП рдХреЛрдб рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдмрд┐рдЯ рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдХреЛ рдЫреВрддреЗ рд╣реБрдП :)рдЗрд╕рд▓рд┐рдП "рдЫреЛрдЯрд╛" рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдмрди рдЧрдпрд╛редрдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!