рд╕рдордп-рд╕рдордп рдкрд░ рд╣реИрдмрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ C ++ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдкреЛрд╕реНрдЯреЛрдВ рдкрд░ рдЖрддрд╛ рд╣реВрдВред рдЪреВрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рд╕реЗ C ++ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдмреНрд▓реЙрдЧ рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрдврд╝рд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ "рд╕реЙрдХреЗрдЯреНрд╕" рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ http-server рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреАред рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдкреНрдд рдПрдХ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ libevent рдФрд░ boost.asio рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреАред рдФрд░ рдЗрд╕ рддрд░рд╣, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред
рдЦреБрдж рдХреЗ рд▓рд┐рдП, рдХрд╛рдо рдкрд░, рдореИрдВрдиреЗ рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдФрд░ рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдпрджрд┐ рдПрдХ рдЫреЛрдЯреЗ http-рд╕рд░реНрд╡рд░ рдХреЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдЗрдЪреНрдЫрд╛ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ libevent рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд░реБрдЪрд┐ рд╣реИ, рдФрд░ рдХреБрдЫ C ++ 11 рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдХреЛрдб рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ 40 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдХрдо рдореЗрдВ рдПрдХ рдореВрд▓ http-рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдкреЛрд╕реНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕рдВрднрд╡рддрдГ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдЬреЛ рдЕрднреА рддрдХ рдкрд░рд┐рд╡рд╛рдж рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЬрд▓реНрдж рд╣реА рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ http-server рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рдордЧреНрд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд░реБрдЪрд┐ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдРрд╕реА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдерд╛, рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЙрдирдХреА рд░рд╛рдп рдФрд░ рдЕрдиреБрднрд╡ред рдФрд░ рдЪреВрдВрдХрд┐ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ "рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рд╛рдордЧреНрд░реА" рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, libev рдФрд░ boost.asio рдХреЗ рд╡рд┐рдкрд░реАрдд, libevent рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд http-server рд╣реИ, рдФрд░ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдореВрд░реНрддрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рдлреА рд╕рдореВрд╣ рднреА рд╣реИред рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд╛рдЬреНрдп рдорд╢реАрди рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХреЛ рд▓рд┐рдЦрдХрд░ рд╕реНрд╡рдпрдВ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм libevent рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдм рдХреБрдЫ рд╣реИред рдпрд╣ рдЗрддрдиреА рдЕрдЪреНрдЫреА рдЫреЛрдЯреА рдмрд╛рдд рд╣реИ, рдпрд╛ рдЖрдк рдХрдо рд╕реНрддрд░ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ HTTP рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ libevent рдкрд░ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рд╕реНрддрд░ рдкрд╕рдВрдж рдЖрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдХрдо рд▓рдЪреАрд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рдмрдбрд╝реА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЙрджреНрднрд╡ рдХреЗ рд╕рд╛рде, рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдФрд░ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рдмрд╛рдж рдиреАрдЪреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ рдХрдИ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ, рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдЯрд╛рдЗрдорд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдЖрд░рдкреАрд╕реА, рдЖрджрд┐ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рджреЛрдиреЛрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпреЛрдВ?
рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЫреЛрдЯрд╛ http-рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ, рдЗрдЪреНрдЫрд╛ рдпрд╛ рдЕрдирд┐рдЪреНрдЫрд╛ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдг рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд░реНрд╡рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдПрдкреАрдЖрдИ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдп рд╕рдВрднрд╡ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ xml рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдереЛрдбрд╝реЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ http-server рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдЫреЛрдЯреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд╡рд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рдмрдирд╛рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдРрд╕реЗ рд╕реНрд╡-рдирд┐рд░реНрдорд┐рдд рдЫреЛрдЯреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рд╕рд░реНрд╡рд░ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдмрдбрд╝реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рднреАрддрд░ рд╕рдорд░реНрдерди рд╕реЗрд╡рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
40 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рд░рд▓ http рд╕рд░реНрд╡рд░
Libevent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб http рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рдХреБрдЫ рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- Event_init рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдиреАрдЪреЗ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред
- рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рд▓реЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ http рд╕рд░реНрд╡рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╕реНрд╡рдпрдВ evhttp_start рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ evhttp_start рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ evhttp_free рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ evhttp_set_gencb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- рддрдм рдЖрдк Event_dispatch рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХрд▓ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк evhttp_request_get_output_buffer рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдмрдлрд╝рд░ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП evbuffer_add_printf рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП evbuffer_add_fileред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ evhttp_send_reply рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
40 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреЛрдб:#include <memory> #include <cstdint> #include <iostream> #include <evhttp.h> int main() { if (!event_init()) { std::cerr << "Failed to init libevent." << std::endl; return -1; } char const SrvAddress[] = "127.0.0.1"; std::uint16_t SrvPort = 5555; std::unique_ptr<evhttp, decltype(&evhttp_free)> Server(evhttp_start(SrvAddress, SrvPort), &evhttp_free); if (!Server) { std::cerr << "Failed to init http server." << std::endl; return -1; } void (*OnReq)(evhttp_request *req, void *) = [] (evhttp_request *req, void *) { auto *OutBuf = evhttp_request_get_output_buffer(req); if (!OutBuf) return; evbuffer_add_printf(OutBuf, "<html><body><center><h1>Hello Wotld!</h1></center></body></html>"); evhttp_send_reply(req, HTTP_OK, "", OutBuf); }; evhttp_set_gencb(Server.get(), OnReq, nullptr); if (event_dispatch() == -1) { std::cerr << "Failed to run messahe loop." << std::endl; return -1; } return 0; }
рдпрд╣ 40 рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдХрдо рдирд┐рдХрд▓рд╛, рдЬреЛ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк evbuffer_add_printf рдлрд╝рдВрдХреНрд╢рди рдХреЛ evbuffer_add_file рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдлрд╝рд╛рдЗрд▓реЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдореВрд▓ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдСрдЯреЛ рдбреАрд▓рд░ рдпрд╛ рд░рд┐рдпрд╛рд▓реНрдЯрд╛рд░ рдХрд╛ рд╕рдкрдирд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рдХрд╛рд░ рдФрд░ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХрднреА рднреА, рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рди рд╣реЛрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЬрд░реВрд░рдд рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рд╣реИ рдФрд░ рдХрд┐рд╕ рд╣рдж рддрдХ ...
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рджрд░реНрд╢рди рдкреИрдХреЗрдЬ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде * nix рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП
ab рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
ab -c 1000 -k -r -t 10 http: //127.0.0.15 555 /рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 64 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рд┐рддрддрд╛ рд╕реНрддрд░: 1000
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп: 2.289 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 50,000
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
рд░рдЦ-рд░рдЦрд╛рд╡ рдЕрдиреБрд░реЛрдз: 50,000
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд: 8500000 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 3200000 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 21843.76 [# / рд╕реЗрдХрдВрдб] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 45.780 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 0.046 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 3626.41 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдореНрд╕ (рдПрдордПрд╕)
рдорд┐рди рдХрд╛ рдорддрд▓рдм рд╣реИ [] sd] рдорд╛рдзреНрдпрд┐рдХрд╛ рдЕрдзрд┐рдХрддрдо
рдХрдиреЗрдХреНрдЯ: 0 3 48.6 0 1001
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: 17 42 9.0 43 93
рдкреНрд░рддреАрдХреНрд╖рд╛: 17 42 9.0 43 93
рдХреБрд▓: 19 45 49.7 43 1053
ab -c 1000 -r -t 10 http: //127.0.0.15555/рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 64 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рд┐рддрддрд╛ рд╕реНрддрд░: 1000
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рд▓рд┐рдпрд╛ рдЧрдпрд╛: 5.004 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 50,000
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд: 6,300,000 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 3200000 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 9992.34 [# / рд╕реЗрдХрдВрдб] (рдорд╛рдзреНрдп)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 100.077 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 0.100 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 1229.53 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдореНрд╕ (рдПрдордПрд╕)
рдорд┐рди рдХрд╛ рдорддрд▓рдм рд╣реИ [] sd] рдорд╛рдзреНрдпрд┐рдХрд╛ рдЕрдзрд┐рдХрддрдо
рдХрдиреЗрдХреНрдЯ: 0 61 214.1 20 3028
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: 7 34 17.6 31 277
рдкреНрд░рддреАрдХреНрд╖рд╛: 6 28 16.9 25 267
рдХреБрд▓: 17 95 219.5 50 3055
рдкрд░реАрдХреНрд╖рдг 32-рдмрд┐рдЯ Ubuntu 12.10 рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдирдП рд▓реИрдкрдЯреЙрдк (2 рдХреЛрд░, 4 рдЬреАрдмреА рд░реИрдо) рдкрд░ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб http рд╕рд░реНрд╡рд░
рдХреНрдпрд╛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рд╕рд╡рд╛рд▓ рдмрдпрд╛рдирдмрд╛рдЬреА рдХрд╛ рд╣реИ ... рдЖрдк рд╕рднреА рдЖрдИрдУ рдХреЛ рдПрдХ рд╕реВрддреНрд░ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрдИ рдзрд╛рдЧреЛрдВ рдореЗрдВ рдкрд┐рд░реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рд╕рд░реНрд╡рд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдХрддрд╛рд░ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреЗ рдкреВрд▓ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВред рдЕрдкрдиреЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕реА ++ 11 рдЖрдкрдХреЛ
рдЖрд░рдПрдЖрдИ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ std :: unique_ptr рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░рддреА рд╣реИред
рдПрдХ рдорд▓реНрдЯреАрдереНрд░реЗрдб рд╕рд░реНрд╡рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдореЗрдВ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рдЬреБрдбрд╝реА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЗрд╕реЗ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдмрдврд╝рд╛рддреА рд╣реИрдВред C ++ рдореЗрдВ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб http рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕реНрд╕реА рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИред
рдПрдХ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдХрдИ рдзрд╛рдЧреЗ рдмрдирд╛рдПрдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рджреЛрдЧреБрдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ред C ++ 11 рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП, event_base_new рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдЕрдВрдд рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ event_base_free рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ std :: unique_ptr рдФрд░ RAII рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
- рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, evhttp_new рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ http-server рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рднреА рдЕрдВрдд рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ evhttp_free рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, evhttp_set_gencb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
- рдпрд╣ рдХрджрдо рд╕рдмрд╕реЗ рдЕрдЬреАрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдирд╛рдирд╛ рдФрд░ рдмрд╛рдВрдзрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдпрд╣рд╛рдВ рдЖрдк рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдмрд╛рдВрдзреЗрдВ), рдФрд░ рдлрд┐рд░ evhttp_accept_socket рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдкрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рдПрдХ рд▓рдВрдмрд╛ рд╕рдордп рд╣реИред Libevent рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, libevent рдпрд╣ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕реНрддрд░ рдиреАрдЪреЗ рдФрд░ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдПрдХ рдЪреБрдиреЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рд╛рд░рд╛ рдХрд╛рд░реНрдп, рдЙрд╕рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ evhttp_bind_socket_with_handle рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдлреНрд▓реЛ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдХреЛ evhttp_bound_socket_get_fd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдзрд╛рдЧреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ evhttp_accept_socket рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдкрд░ рднреА рдЖрд╕рд╛рди рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд░реНрдХрд▓реЗ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП, рддреЛ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдХреЛрдб рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред
- рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред Libevent (event_base_dispatch) рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рд╣реИред рдЕрдкрдиреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдПрдХ рдорд╛рдЗрдирд╕ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ - рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рд╣реА рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк event_base_loopexit рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдЪрдХрдорд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдк function event_base_loop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ рднрд▓реЗ рд╣реА рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯ рди рд╣реЛрдВ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЪрдХреНрд░ рдФрд░ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╢реВрдиреНрдп рднреА рд╣реИ - рд╡реНрдпрд░реНрде рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдереЛрдбрд╝реА рджреЗрд░реА (рд╕реА ++ 11 рдореЗрдВ - рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ: std :: this_thread :: sleep_for (std :: chrono :: milliseconds (10)) рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ )ред
- рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИред
- рдЕрдЧрд▓реЗ рдзрд╛рдЧреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рд╕рдХрддреА рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдкрд░рд┐рд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реВрдЪрдирд╛ рджреАред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрд╕реА C ++ 11 рдЯреВрд▓ (std :: рдЕрдкрд╡рд╛рдж_ptr, std :: current_exception рдФрд░ std :: rethrow_exception) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдмрд╛рд╣рд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ
рд╕рд░рд▓ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕рд░реНрд╡рд░ рдХреЛрдб: #include <stdexcept> #include <iostream> #include <memory> #include <chrono> #include <thread> #include <cstdint> #include <vector> #include <evhttp.h> int main() { char const SrvAddress[] = "127.0.0.1"; std::uint16_t const SrvPort = 5555; int const SrvThreadCount = 4; try { void (*OnRequest)(evhttp_request *, void *) = [] (evhttp_request *req, void *) { auto *OutBuf = evhttp_request_get_output_buffer(req); if (!OutBuf) return; evbuffer_add_printf(OutBuf, "<html><body><center><h1>Hello Wotld!</h1></center></body></html>"); evhttp_send_reply(req, HTTP_OK, "", OutBuf); }; std::exception_ptr InitExcept; bool volatile IsRun = true; evutil_socket_t Socket = -1; auto ThreadFunc = [&] () { try { std::unique_ptr<event_base, decltype(&event_base_free)> EventBase(event_base_new(), &event_base_free); if (!EventBase) throw std::runtime_error("Failed to create new base_event."); std::unique_ptr<evhttp, decltype(&evhttp_free)> EvHttp(evhttp_new(EventBase.get()), &evhttp_free); if (!EvHttp) throw std::runtime_error("Failed to create new evhttp."); evhttp_set_gencb(EvHttp.get(), OnRequest, nullptr); if (Socket == -1) { auto *BoundSock = evhttp_bind_socket_with_handle(EvHttp.get(), SrvAddress, SrvPort); if (!BoundSock) throw std::runtime_error("Failed to bind server socket."); if ((Socket = evhttp_bound_socket_get_fd(BoundSock)) == -1) throw std::runtime_error("Failed to get server socket for next instance."); } else { if (evhttp_accept_socket(EvHttp.get(), Socket) == -1) throw std::runtime_error("Failed to bind server socket for new instance."); } for ( ; IsRun ; ) { event_base_loop(EventBase.get(), EVLOOP_NONBLOCK); std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } catch (...) { InitExcept = std::current_exception(); } }; auto ThreadDeleter = [&] (std::thread *t) { IsRun = false; t->join(); delete t; }; typedef std::unique_ptr<std::thread, decltype(ThreadDeleter)> ThreadPtr; typedef std::vector<ThreadPtr> ThreadPool; ThreadPool Threads; for (int i = 0 ; i < SrvThreadCount ; ++i) { ThreadPtr Thread(new std::thread(ThreadFunc), ThreadDeleter); std::this_thread::sleep_for(std::chrono::milliseconds(500)); if (InitExcept != std::exception_ptr()) { IsRun = false; std::rethrow_exception(InitExcept); } Threads.push_back(std::move(Thread)); } std::cout << "Press Enter fot quit." << std::endl; std::cin.get(); IsRun = false; } catch (std::exception const &e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; }
рдХреЛрдб рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреБрдЫ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╣реИрдХ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рддрдп рд╣реЛ рдЬрд╛рдПрдЧреАред рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╡реЗ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП "рдЕрдЬреАрдм рдХрджрдо" рдХрд╛ рдХрд╛рдо рдХрд░реЗрдВред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╣реИрдХ рдХреЛ рдЕрднреА рд░рд╣рдиреЗ рджреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╕рдорд╛рдзрд╛рди рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзреЗрдпред рдЙрд╕реА рд╕рдордп, рдЖрдк рдХреЛрдб рдХреЗ рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреЛ C ++ 03 рд╢реИрд▓реА рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рд╣реЛ рдЧрдИ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЬрдм рдХреЛрдб рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд▓реИрдореНрдмреНрдбрд╛ рдЕрдкрдиреА рдЫреЛрдЯреА рд╕реЗ рдЫреЛрдЯреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдмреЗрд╢рдХ рдЖрдкрдХреЛ рдЪрд░рдо рд╕реАрдорд╛ рдкрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ 700 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓реЗрдЦрди рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЫрд╛рддреНрд░ рдХреА рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЦреНрдп рдХрд╛рд░реНрдпред
рдмрд╣реБрд╕реНрддрд░реАрдп рд╕рд░реНрд╡рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
ab -c 1000 -k -r -t 10 http: //127.0.0.15 555 /рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 64 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рд┐рддрддрд╛ рд╕реНрддрд░: 1000
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп: 1.576 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 50,000
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
рд░рдЦ-рд░рдЦрд╛рд╡ рдЕрдиреБрд░реЛрдз: 50,000
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд: 8500000 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 3200000 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 31717.96 [# / рд╕реЗрдХрдВрдб] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 31.528 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 0.032 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 5265.68 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
ab -c 1000 -r -t 10 http: //127.0.0.15555/рд╕рд░реНрд╡рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░:
рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрдирд╛рдо: 127.0.0.1
рд╕рд░реНрд╡рд░ рдкреЛрд░реНрдЯ: 5555
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрде: /
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд▓рдВрдмрд╛рдИ: 64 рдмрд╛рдЗрдЯреНрд╕
рд╕рдореНтАНрдорд┐рд▓рд┐рддрддрд╛ рд╕реНрддрд░: 1000
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп: 3.685 рд╕реЗрдХрдВрдб
рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз: 50,000
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
рдХреБрд▓ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд: 6,300,000 рдмрд╛рдЗрдЯреНрд╕
HTML рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд: 3200000 рдмрд╛рдЗрдЯреНрд╕
рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз: 13568.41 [# / рд╕реЗрдХрдВрдб] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 73.701 [рдПрдордПрд╕] (рдорддрд▓рдм)
рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдордп: 0.074 [рдПрдордПрд╕] (рдорддрд▓рдм, рд╕рднреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкрд╛рд░)
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рджрд░: 1669.55 [Kbytes / sec] рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛
рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдореНрд╕ (рдПрдордПрд╕)
рдорд┐рди рдХрд╛ рдорддрд▓рдм рд╣реИ [] sd] рдорд╛рдзреНрдпрд┐рдХрд╛ рдЕрдзрд┐рдХрддрдо
рдХрдиреЗрдХреНрдЯ: 0 36 117.2 23 1033
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: 3 37 10.0 37 247
рдкреНрд░рддреАрдХреНрд╖рд╛: 3 30 8.7 30 242
рдХреБрд▓: реп .8рей резрез 9. :рем 61 резрежред реп
рд╕рд░реНрд╡рд░ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг
рдмреБрдирд┐рдпрд╛рджреА рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрдХрд░рдг рднреА рд╣реЛрддреЗ рд╣реИрдВред рдЕрдм рдмрд╛рд░реА рдЖрдИ рдФрд░ рдХреБрдЫ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдереЛрдбрд╝реА рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред
рдиреНрдпреВрдирддрдо http рд╕рд░реНрд╡рд░:
#include "http_server.h" #include "http_headers.h" #include "http_content_type.h" #include <iostream> int main() { try { using namespace Network; HttpServer Srv("127.0.0.1", 5555, 4, [&] (IHttpRequestPtr req) { req->SetResponseAttr(Http::Response::Header::Server::Value, "MyTestServer"); req->SetResponseAttr(Http::Response::Header::ContentType::Value, Http::Content::Type::html::Value); req->SetResponseString("<html><body><center><h1>Hello Wotld!</h1></center></body></html>"); }); std::cout << "Press Enter for quit." << std::endl; std::cin.get(); } catch (std::exception const &e) { std::cout << e.what() << std::endl; } return 0; }
C ++ http рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдбред рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрд▓реНрдХ рд╣реИред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреА рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд╛рджрдЧреА рдХрд╛ рднреБрдЧрддрд╛рди рд▓рд┐рдмрд░реНрдЯреАрд╡реЗрдВрдЯ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЖрд╡рд░рдг рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд┐рдХреНрд░реА рдореЗрдВ рдереЛрдбрд╝реА рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИред рдиреАрдЪреЗ, рдЗрд╕рдХреЗ рдЕрдВрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд░реНрд╡рд░ рдХреНрд░рд┐рдПрд╢рди:
- рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ HttpServerред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рдкрддреЗ рдФрд░ рдкреЛрд░реНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рд╕ рдкрд░ рд╕рд░реНрд╡рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдиреНрдпреВрдирддрдо рд╣реИ, рдЖрдк рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ рдмрдирд╛рдП рдмрд┐рдирд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд▓рдВрдмреЛрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) ред рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд░ рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдЙрд╕рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореМрдЬреВрдж рд╣реИред
- рд╣реИрдВрдбрд▓рд░ IHttpRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рднреА рдХрд╛рдо рд▓рд┐рдмрд░рд╡реЗрдВрдЯ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдЫрд┐рдк рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
IHttpRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ namespace Network { DECLARE_RUNTIME_EXCEPTION(HttpRequest) struct IHttpRequest { enum class Type { HEAD, GET, PUT, POST }; typedef std::unordered_map<std::string, std::string> RequestParams; virtual ~IHttpRequest() {} virtual Type GetRequestType() const = 0; virtual std::string const GetHeaderAttr(char const *attrName) const = 0; virtual std::size_t GetContentSize() const = 0; virtual void GetContent(void *buf, std::size_t len, bool remove) const = 0; virtual std::string const GetPath() const = 0; virtual RequestParams const GetParams() const = 0; virtual void SetResponseAttr(std::string const &name, std::string const &val) = 0; virtual void SetResponseCode(int code) = 0; virtual void SetResponseString(std::string const &str) = 0; virtual void SetResponseBuf(void const *data, std::size_t bytes) = 0; virtual void SetResponseFile(std::string const &fileName) = 0; }; typedef std::shared_ptr<IHttpRequest> IHttpRequestPtr; }
рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░, рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ (рд╣реЗрдбрд░), рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛ, рд╕рд╛рде рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ (рд╣реЗрдбрд░) рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп (рдЗрд╕рдореЗрдВ) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рдХреБрдЫ рдмрдлрд░ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓)ред рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ HttpRequestException рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИред
рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
req->SetResponseAttr(Http::Response::Header::Server::Value, "MyTestServer"); req->SetResponseAttr(Http::Response::Header::ContentType::Value, Http::Content::Type::html::Value);
рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдХрд╛ рдЧрдарди рд╣реИ, рдФрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдб рдЬреИрд╕реЗ "рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░" рдФрд░ "рд╕рд░реНрд╡рд░" рд╕реЗрдЯ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ libevent рдореЗрдВ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ HTTP рдХреА рдЬрд░реВрд░рддреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЖрдЧреЗ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдореЗрдВ рд╣реЗрдбрд░ рдлреАрд▓реНрдб рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдХреЛрдИ рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ; рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреА рдЕрдзреВрд░реА рд╕реВрдЪреА рд╣реИ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдбреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рдЯрд╛рдЗрдкреЛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЧрдбрд╝рдмрдбрд╝ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА libevent рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЖрд╡рд░рдг рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг namespace Network { namespace Http { namespace Request { namespace Header { DECLARE_STRING_CONSTANT(Accept, Accept) DECLARE_STRING_CONSTANT(AcceptCharset, Accept-Charset)
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реЗрдбрд░ рдХреА рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдореЗрдВ рд╢реБрджреНрдз рд╕реА рдХреА рдкреБрд░рд╛рдиреА рд╢реИрд▓реА рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рд╕рд░рд▓ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕реАрдПрдЪ рд╢реИрд▓реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди .h рдФрд░ .cpp рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдкрдиреА рдШреЛрд╖рдгрд╛рдУрдВ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдлрд╝рд╛рдЗрд▓ рд░рд┐рдХреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ C ++ рд╢реИрд▓реА рдореЗрдВ рд╕рднреА рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдХреЗрд╡рд▓ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХреБрдЫ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореИрдХреНрд░реЛ (рдореИрдХреНрд░реЛрд╕, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, C ++ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдмреБрд░рд╛рдИ, рдФрд░ рд╕рд╛рде рд╣реА рдЫреЛрдЯреА рдЦреБрд░рд╛рдХ рдореЗрдВ рдмрд╛рдо рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ; рд╡рд┐рд╖рдо рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рд╣реИ)ред
DECLARE_STRING_CONSTANT #define DECLARE_STRING_CONSTANT(name_, value_) \ namespace Private \ { \ template <typename T> \ struct name_ \ { \ static char const Name[]; \ static char const Value[]; \ }; \ template <typename T> \ char const name_ <T>::Name[] = #name_; \ template <typename T> \ char const name_ <T>::Value[] = #value_; \ } \ typedef Private:: name_ <void> name_;
рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рд╕реЗ, рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рдВрд╢реЛрдзрди рдХрд░реЗрдВред рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рднреЗрдЬрддреЗ рд╕рдордп рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдХреА рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЖрд╡рдХ рдЕрдиреБрд░реЛрдз рд╕реЗ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕ рд╣реЛрд╕реНрдЯ рд╕реЗ рдФрд░ рдХрд┐рд╕ рдкреГрд╖реНрда рд╕реЗ рдЕрдиреБрд░реЛрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реБрдЖ рдерд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреБрдХреАрдЬрд╝ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рд╕реЗ рдпрд╣ рд╕рдм рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
std::string Host = req->GetHeaderAttr(Http::Request::Header::Host::Value); std::string Referer = req->GetHeaderAttr(Http::Request::Header::Referer::Value); std::string Cookie = req->GetHeaderAttr(Http::Request::Header::Cookie::Value);
рдЗрд╕реА рддрд░рд╣, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рдХреБрдХреАрдЬрд╝ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЙрд╕рдХреЗ рд╕рддреНрд░ рдФрд░ рдЯреНрд░реИрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╣ рдЖрдкрдХреЗ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдШреВрдордирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд░реНрд╡рд░ рдХреЛрдб рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреБрдЫ рдПрдкреАрдЖрдИ рдХреЛ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рддрд░реАрдХреЗ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ: рдПрдХ рд╕рддреНрд░ рдЦреЛрд▓рдирд╛, рд╕рд░реНрд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рд╕рддреНрд░ рдмрдВрдж рдХрд░рдирд╛ред рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрд╕ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдиреЗ рджреЗрдВ:
http://myserver.com/service/login/OpenSession?user=nym&pwd=kakoyto
http://myserver.com/service/login/CliseSession?sessionId=nym1234567890
http://myserver.com/service/stat/GetInfo?sessionId=nym1234567890
рдЗрди рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдХрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд░реНрд╡рд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, xml рдкреНрд░рд╛рд░реВрдк рдореЗрдВред рдпрд╣ рд╕рд░реНрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рд╡реНрдпрд╡рд╕рд╛рдп рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ, рдЙрдирд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╣реИрдВ:
auto Path = req->GetPath(); auto Params = req->GetParams();
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддрд░реАрдХрд╛ / рд╕реЗрд╡рд╛ / рд▓реЙрдЧрд┐рди / OpenSession рд╣реЛрдЧрд╛, рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХреБрдВрдЬреА / рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛рд░реНрдб рдХрд╛ рдкреНрд░рдХрд╛рд░:
typedef std::unordered_map<std::string, std::string> RequestParams;
рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдХрд┐ рдЖрд╡рд░рдг рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд╛рдж рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдЗрд╕ рдЖрд╡рд░рдг рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдХреНрд╖рд╛ HttpServer namespace Network { DECLARE_RUNTIME_EXCEPTION(HttpServer) class HttpServer final : private Common::NonCopyable { public: typedef std::vector<IHttpRequest::Type> MethodPool; typedef std::function<void (IHttpRequestPtr)> OnRequestFunc; enum { MaxHeaderSize = static_cast<std::size_t>(-1), MaxBodySize = MaxHeaderSize }; HttpServer(std::string const &address, std::uint16_t port, std::uint16_t threadCount, OnRequestFunc const &onRequest, MethodPool const &allowedMethods = {IHttpRequest::Type::GET }, std::size_t maxHeadersSize = MaxHeaderSize, std::size_t maxBodySize = MaxBodySize); private: volatile bool IsRun = true; void (*ThreadDeleter)(std::thread *t) = [] (std::thread *t) { t->join(); delete t; };; typedef std::unique_ptr<std::thread, decltype(ThreadDeleter)> ThreadPtr; typedef std::vector<ThreadPtr> ThreadPool; ThreadPool Threads; Common::BoolFlagInvertor RunFlag; }; } </source</spoiler> <spoiler title=" HttpServer"><source lang="cpp"> namespace Network { HttpServer::HttpServer(std::string const &address, std::uint16_t port, std::uint16_t threadCount, OnRequestFunc const &onRequest, MethodPool const &allowedMethods, std::size_t maxHeadersSize, std::size_t maxBodySize) : RunFlag(&IsRun) { int AllowedMethods = -1; for (auto const i : allowedMethods) AllowedMethods |= HttpRequestTypeToAllowedMethod(i); bool volatile DoneInitThread = false; std::exception_ptr Except; evutil_socket_t Socket = -1; auto ThreadFunc = [&] () { try { bool volatile ProcessRequest = false; RequestParams ReqPrm; ReqPrm.Func = onRequest; ReqPrm.Process = &ProcessRequest; typedef std::unique_ptr<event_base, decltype(&event_base_free)> EventBasePtr; EventBasePtr EventBase(event_base_new(), &event_base_free); if (!EventBase) throw HttpServerException("Failed to create new base_event."); typedef std::unique_ptr<evhttp, decltype(&evhttp_free)> EvHttpPtr; EvHttpPtr EvHttp(evhttp_new(EventBase.get()), &evhttp_free); if (!EvHttp) throw HttpServerException("Failed to create new evhttp."); evhttp_set_allowed_methods(EvHttp.get(), AllowedMethods); if (maxHeadersSize != MaxHeaderSize) evhttp_set_max_headers_size(EvHttp.get(), maxHeadersSize); if (maxBodySize != MaxBodySize) evhttp_set_max_body_size(EvHttp.get(), maxBodySize); evhttp_set_gencb(EvHttp.get(), &OnRawRequest, &ReqPrm); if (Socket == -1) { auto *BoundSock = evhttp_bind_socket_with_handle(EvHttp.get(), address.c_str(), port); if (!BoundSock) throw HttpServerException("Failed to bind server socket."); if ((Socket = evhttp_bound_socket_get_fd(BoundSock)) == -1) throw HttpServerException("Failed to get server socket for next instance."); } else { if (evhttp_accept_socket(EvHttp.get(), Socket) == -1) throw HttpServerException("Failed to bind server socket for new instance."); } DoneInitThread = true; for ( ; IsRun ; ) { ProcessRequest = false; event_base_loop(EventBase.get(), EVLOOP_NONBLOCK); if (!ProcessRequest) std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } catch (...) { Except = std::current_exception(); } }; ThreadPool NewThreads; for (int i = 0 ; i < threadCount ; ++i) { DoneInitThread = false; ThreadPtr Thread(new std::thread(ThreadFunc), ThreadDeleter); NewThreads.push_back(std::move(Thread)); for ( ; ; ) { if (Except != std::exception_ptr()) { IsRun = false; std::rethrow_exception(Except); } if (DoneInitThread) break; std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } Threads = std::move(NewThreads); } }
рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ IHttpRequest рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рднреА рд╣рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ libevent рдмрдлрд╝рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдирд┐рдпрдорд┐рдд рдХрд╛рдо рдореЗрдВ рдереЛрдбрд╝реА рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИред рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрди рдФрд░ рдереЛрдбрд╝рд╛ "рдЯреНрдпреВрдирд┐рдВрдЧ" рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд░реНрд╡рд░ рдХреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЖрдк рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП, libevent рдореЗрдВ evhttp_set_allowed_methods рдлрд╝рдВрдХреНрд╢рди рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЖрд╡рд░рдг рдХреЗрд╡рд▓ GET рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ)ред рдЬрдм рдмрд╛рдХреА рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрд┐рдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ libevent рдЦреБрдж рдРрд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗредрдорди рдХреА рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛, рдпрд╣ рдЕрд▓рдЧ рд╣реИ: рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗред рд╕рд░реНрд╡рд░ рдХреЛ "рднрд░рдиреЗ" рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдорди рдХреА рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ, рдЗрд╕реЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд╖реЗрдзрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ http-рдкреИрдХреЗрдЯ рд╢реАрд░реНрд╖рдХ рднреЗрдЬрдирд╛ рдпрд╛ рдПрдХ рдмрдбрд╝реЗ рдЕрдиреБрд░реЛрдз рд╡рд╛рд▓реЗ рдирд┐рдХрд╛рдп рдХреЛ рднреА evhttp_set_max_headers_size рдФрд░ evhttp_set_max_body_size рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдмрдбрд╝реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рди рдХреЗрд╡рд▓ рдмреБрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХреА рдЕрд╡рд╛рдВрдЫрд┐рдд рджреБрд░реНрдШрдЯрдирд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░реЗрдВрдЧреАред рдХреБрдЫ рдФрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ ...рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреВрдВрдЧрд╛, рдЬреЛ рдЬреАрдИрдЯреА рдЕрдиреБрд░реЛрдзреЛрдВ (рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рджреЗрддрд╛ рд╣реИ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдореЗрдЬрдмрд╛рди рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрд┐рд╕ рдкреГрд╖реНрда рд╕реЗ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реБрдЖ рдерд╛редрдПрдХ рд╕рд╛рдзрд╛рд░рдг http рд╕рд░реНрд╡рд░ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг #include "http_server.h" #include "http_headers.h" #include "http_content_type.h" #include <iostream> #include <sstream> #include <mutex> int main() { char const SrvAddress[] = "127.0.0.1"; std::uint16_t SrvPort = 5555; std::uint16_t SrvThreadCount = 4; std::string const RootDir = "../test_content"; std::string const DefaultPage = "index.html"; std::mutex Mtx; try { using namespace Network; HttpServer Srv(SrvAddress, SrvPort, SrvThreadCount, [&] (IHttpRequestPtr req) { std::string Path = req->GetPath(); Path = RootDir + Path + (Path == "/" ? DefaultPage : std::string()); { std::stringstream Io; Io << "Path: " << Path << std::endl << Http::Request::Header::Host::Name << ": " << req->GetHeaderAttr(Http::Request::Header::Host::Value) << std::endl << Http::Request::Header::Referer::Name << ": " << req->GetHeaderAttr(Http::Request::Header::Referer::Value) << std::endl; std::lock_guard<std::mutex> Lock(Mtx); std::cout << Io.str() << std::endl; } req->SetResponseAttr(Http::Response::Header::Server::Value, "MyTestServer"); req->SetResponseAttr(Http::Response::Header::ContentType::Value, Http::Content::TypeFromFileName(Path)); req->SetResponseFile(Path); }); std::cin.get(); } catch (std::exception const &e) { std::cout << e.what() << std::endl; } return 0; }
рдирд┐рд╖реНрдХрд░реНрд╖
рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдмрд╡реЗрдВрдЯ рдореЗрдВ рдЕрднреА рднреА рдХрдИ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░: рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрдирд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдиреЗ рдХреЗрд╡рд▓ рдЕрдкрдирд╛ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рджрд┐рдЦрд╛рдпрд╛, рдЬрд┐рд╕реЗ http-server рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓реЗрдВ рдЧреАрдереВрдм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, http рд╕рд░реНрд╡рд░ рдХреЛ рдореЗрд░реЗ рдЕрдиреНрдп рд╣реЛрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ редрдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо:ab -c 1000 -k -r -t 10 http: // localhost: 8888 / libevent_test_http_srv.zipServer Software: test
Server Hostname: test
Server Port: 8888
Document Path: /libevent_test_http_srv.zip
Document Length: 23756 bytes
Concurrency Level: 1000
Time taken for tests: 10.012 seconds
Complete requests: 2293
рд╡рд┐рдлрд▓ рдЕрдиреБрд░реЛрдз: 0
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ: 0
Keep-Alive requests: 2293
Total transferred: 60628847 bytes
HTML transferred: 60328370 bytes
Requests per second: 229.02 [#/sec] (mean)
Time per request: 4366.365 [ms] (mean)
Time per request: 4.366 [ms] (mean, across all concurrent requests)
Transfer rate: 5913.65 [Kbytes/sec] received
рд▓реЛрд╣реЗ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рджрд╕ рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдврд╛рдИ рд╣рдЬрд╛рд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдЕрдиреБрд░реЛрдз ...рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!
рд╕рд╛рдордЧреНрд░реА