{"id":217437,"date":"2014-03-30T13:27:02","date_gmt":"2014-03-30T09:27:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=217437"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=217437","title":{"rendered":"<span class=\"post_title\">\u0421\u0432\u043e\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u0432 40 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 libevent \u0438 C++11<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/0c3\/ee5\/939\/0c3ee593920d23b63192407b9045eef1.jpg\" align=\"left\"\/> \u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0425\u0430\u0431\u0440, \u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e \u043f\u043e\u0441\u0442\u044b \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 C++ \u0438\u043b\u0438 \u043d\u0430 \u0438\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 C++ \u0438\u0437 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u0433 \u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438 \u0447\u0438\u0442\u0430\u044e. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043f\u043e\u043b\u0438\u0441\u0442\u0430\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u00ab\u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0430\u0445\u00bb, \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c boost.asio \u0438\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0435\u0449\u0435. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u0442\u0430\u043a \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u043e\u0441\u0442 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u041d\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043e\u043d\u044b\u043c \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0440\u0430\u0434\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 libevent \u0438 boost.asio \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438. \u0410 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043a-\u0442\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<p>  \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u043a\u0430\u043a-\u0442\u043e \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b libevent \u0438 libev. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u043a\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 libevent, \u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432 C++11 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u0435\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 40 \u0441\u0442\u0440\u043e\u043a.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u0441\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0442\u0435\u043c, \u043a\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 libevent \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u043a\u043e\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043b\u044e\u0434\u0435\u0439, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0438 \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0438\u043c\u0435\u043b\u0438 \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0445 \u043c\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u043f\u044b\u0442. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0441\u0442 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u043e\u0433\u043e, \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043c\u0435\u0442\u043a\u0443 \u00ab\u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u00bb.<\/p>\n<p>  \u0427\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u0430 libevent \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, libev \u0438 boost.asio, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440, \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0443\u0444\u0435\u0440\u0430\u043c\u0438. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043c\u0430\u043b\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041c\u043e\u0436\u043d\u043e HTTP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u0441\u0430\u043c\u043e\u043c\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0438\u043b\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 libevent \u044d\u0442\u043e \u0432\u0441\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c. \u042d\u0442\u0430 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u043f\u043b\u044e\u0448\u043a\u0430, \u0430 \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0436\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043b\u044f HTTP, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 libevent. \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043d\u0435\u0439 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043c\u0435\u043d\u0435\u0435 \u0433\u0438\u0431\u043e\u043a. \u041f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0437\u0430 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u0441\u0435 \u043d\u0438\u0436\u0435 \u0438 \u043d\u0438\u0436\u0435. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438: \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434, \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0442\u044c\u044e, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0430\u0439\u043c\u0435\u0440\u0430\u043c\u0438, rpc, \u0442.\u00a0\u0434; \u043c\u043e\u0436\u043d\u043e \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435, \u0442\u0430\u043a \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u041f\u041e.<\/p>\n<h4>\u0417\u0430\u0447\u0435\u043c?<\/h4>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u0438\u043b\u0438 \u043d\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u0412\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u041f\u041e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 \u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0443 \u0412\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 API \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u041f\u041e \u0447\u0435\u0440\u0435\u0437 HTTP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 HTTP. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GET \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 xml \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u0438\u043b\u0438 \u0435\u0449\u0435 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0441 \u043c\u0430\u043b\u044b\u043c\u0438 \u0442\u0440\u0443\u0434\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0412\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u041f\u041e. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e \u0440\u0430\u0437\u0434\u0430\u0447\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c. \u0412 \u043e\u0431\u0449\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u041f\u041e, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c.<\/p>\n<h4>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u0432 40 \u0441\u0442\u0440\u043e\u043a<\/h4>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e libevent \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u0445 \u0448\u0430\u0433\u043e\u0432:  <\/p>\n<ul>\n<li>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 event_init. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evhttp_start \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_start \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_free.<\/li>\n<li>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_set_gencb.<\/li>\n<li>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 event_dispatch. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0441 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c.<\/li>\n<li>\u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0443\u0444\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evhttp_request_get_output_buffer. \u0412 \u044d\u0442\u043e\u0442 \u0431\u0443\u0444\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evbuffer_add_printf, \u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evbuffer_add_file. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_send_reply.<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u0432 40 \u0441\u0442\u0440\u043e\u043a:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;memory&gt; #include &lt;cstdint&gt; #include &lt;iostream&gt; #include &lt;evhttp.h&gt; int main() {   if (!event_init())   {     std::cerr &lt;&lt; &quot;Failed to init libevent.&quot; &lt;&lt; std::endl;     return -1;   }   char const SrvAddress[] = &quot;127.0.0.1&quot;;   std::uint16_t SrvPort = 5555;   std::unique_ptr&lt;evhttp, decltype(&evhttp_free)&gt; Server(evhttp_start(SrvAddress, SrvPort), &evhttp_free);   if (!Server)   {     std::cerr &lt;&lt; &quot;Failed to init http server.&quot; &lt;&lt; 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, &quot;&lt;html&gt;&lt;body&gt;&lt;center&gt;&lt;h1&gt;Hello Wotld!&lt;\/h1&gt;&lt;\/center&gt;&lt;\/body&gt;&lt;\/html&gt;&quot;);     evhttp_send_reply(req, HTTP_OK, &quot;&quot;, OutBuf);   };   evhttp_set_gencb(Server.get(), OnReq, nullptr);   if (event_dispatch() == -1)   {     std::cerr &lt;&lt; &quot;Failed to run messahe loop.&quot; &lt;&lt; std::endl;     return -1;   }   return 0; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u0435\u0435 40 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c http-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u0432 \u043e\u0442\u0432\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u00abHello World\u00bb, \u0430 \u0435\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e evbuffer_add_printf \u043d\u0430 evbuffer_add_file, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b. \u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430\u0446\u0438\u0435\u0439. \u041b\u044e\u0431\u043e\u0439 \u0430\u0432\u0442\u043e \u0434\u0438\u043b\u0435\u0440 \u0438\u043b\u0438 \u0440\u0438\u044d\u043b\u0442\u043e\u0440 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043c \u043c\u0435\u0447\u0442\u0430\u044e\u0442, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0430\u0432\u0442\u043e \u0438 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0438 \u043d\u0438 \u043f\u0440\u0438 \u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u043b\u0438 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430\u0446\u0438\u0438, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438. \u0410 \u0432\u043e\u0442 \u043d\u0443\u0436\u043d\u044b \u043b\u0438 \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0446\u0438\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044e \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435\u2026<\/p>\n<p>  \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u044b <b>ab<\/b> \u0434\u043b\u044f *nix \u0441\u0438\u0441\u0442\u0435\u043c \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ab -c 1000 -k -r -t 10 http:\/\/127.0.0.1:5555\/<\/b><\/p>\n<div class=\"spoiler_text\">Server Software: <br \/>  Server Hostname: 127.0.0.1<br \/>  Server Port: 5555<\/p>\n<p>  Document Path: \/<br \/>  Document Length: 64 bytes<\/p>\n<p>  Concurrency Level: 1000<br \/>  Time taken for tests: 2.289 seconds<br \/>  Complete requests: 50000<br \/>  Failed requests: 0<br \/>  Write errors: 0<br \/>  Keep-Alive requests: 50000<br \/>  Total transferred: 8500000 bytes<br \/>  HTML transferred: 3200000 bytes<br \/>  Requests per second: 21843.76 [#\/sec] (mean)<br \/>  Time per request: 45.780 [ms] (mean)<br \/>  Time per request: 0.046 [ms] (mean, across all concurrent requests)<br \/>  Transfer rate: 3626.41 [Kbytes\/sec] received<\/p>\n<p>  Connection Times (ms)<br \/>   min mean[\u00b1sd] median max<br \/>  Connect: 0 3 48.6 0 1001<br \/>  Processing: 17 42 9.0 43 93<br \/>  Waiting: 17 42 9.0 43 93<br \/>  Total: 19 45 49.7 43 1053  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ab -c 1000 -r -t 10 http:\/\/127.0.0.1:5555\/<\/b><\/p>\n<div class=\"spoiler_text\">Server Software: <br \/>  Server Hostname: 127.0.0.1<br \/>  Server Port: 5555<\/p>\n<p>  Document Path: \/<br \/>  Document Length: 64 bytes<\/p>\n<p>  Concurrency Level: 1000<br \/>  Time taken for tests: 5.004 seconds<br \/>  Complete requests: 50000<br \/>  Failed requests: 0<br \/>  Write errors: 0<br \/>  Total transferred: 6300000 bytes<br \/>  HTML transferred: 3200000 bytes<br \/>  Requests per second: 9992.34 [#\/sec] (mean)<br \/>  Time per request: 100.077 [ms] (mean)<br \/>  Time per request: 0.100 [ms] (mean, across all concurrent requests)<br \/>  Transfer rate: 1229.53 [Kbytes\/sec] received<\/p>\n<p>  Connection Times (ms)<br \/>   min mean[\u00b1sd] median max<br \/>  Connect: 0 61 214.1 20 3028<br \/>  Processing: 7 34 17.6 31 277<br \/>  Waiting: 6 28 16.9 25 267<br \/>  Total: 17 95 219.5 50 3055  <\/div>\n<\/div>\n<p>  \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0441\u044f \u043d\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u043e\u0432\u043e\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 (2 \u044f\u0434\u0440\u0430, 4\u0413\u0431 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438) \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c 32-\u0445 \u0431\u0438\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Ubuntu 12.10.<\/p>\n<h4>\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440<\/h4>\n<p>  \u041d\u0443\u0436\u043d\u0430 \u043b\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c? \u0412\u043e\u043f\u0440\u043e\u0441 \u0440\u0438\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u2026 \u041c\u043e\u0436\u043d\u043e \u0432\u0441\u0435 IO \u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u0442\u044c \u0435\u0435 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0438 \u043f\u0443\u043b\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043d\u0430\u043c\u043d\u043e\u0433\u043e. C++11 \u0441 \u0435\u0433\u043e \u0443\u043c\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\">RAII<\/a>, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0441 std::unique_ptr \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0434.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c\u0443, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0435\u0433\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 2 \u0440\u0430\u0437\u0430 \u043f\u043e \u043e\u0431\u044a\u0435\u043c\u0443 \u043a\u043e\u0434\u0430. \u0412\u043e\u0441\u0435\u043c\u044c\u0434\u0435\u0441\u044f\u0442 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 C++ \u2014 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0438 \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u041e\u0434\u043d\u043e \u0438\u0437 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0432\u043d\u043e\u0435 \u0443\u0434\u0432\u043e\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. C++11 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438.<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 event_base_new. \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 event_base_free, \u0430 std::unique_ptr \u0438 RAII \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e.<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0448\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 evhttp_new. \u042d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0430\u043a \u0436\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_free.<\/li>\n<li>\u0422\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_set_gencb.<\/li>\n<li>\u042d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c. \u041d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u043a \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 (\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443), \u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evhttp_accept_socket. \u042d\u0442\u043e \u0434\u043e\u043b\u0433\u043e. Libevent \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u0430\u043a \u0443\u0436\u0435 \u0432\u044b\u0448\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0431\u044b\u043b\u043e, libevent \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0438\u0436\u0435 \u0438 \u043d\u0438\u0436\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u043e\u043a\u0435\u0442\u0430, \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evhttp_bind_socket_with_handle \u0438 \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043a\u0435\u0442 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e evhttp_bound_socket_get_fd. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 \u0435\u0433\u043e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 evhttp_accept_socket. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043d\u043e \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438, \u0438 \u0435\u0449\u0435 \u043f\u0440\u043e\u0449\u0435 \u0435\u0441\u043b\u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b API \u0434\u043b\u044f \u0431\u0435\u0440\u043a\u043b\u0438 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043e\u043d\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u0412\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0435 \u041f\u041e \u0441 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f Windows \u0438 Linux, \u0442\u043e \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043d\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u043a\u043e\u0434\u0443 \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0443\u044e.<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432 libevent (event_base_dispatch). \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u0432 \u043d\u0435\u0439 \u0432\u0438\u0436\u0443 \u043e\u0434\u0438\u043d \u043c\u0438\u043d\u0443\u0441 \u2014 \u0435\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0434\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c event_base_loopexit). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f. \u0410 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 event_base_loop. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438. \u0415\u0441\u0442\u044c \u0438 \u043c\u0438\u043d\u0443\u0441 \u2014 \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u043e \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430 \u0445\u043e\u043b\u043e\u0441\u0442\u043e\u043c \u0445\u043e\u0434\u0443 \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0445\u043e\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 (\u0432 C++11 \u2014 &#8216;\u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: std::this_thread::sleep_for(std::chrono::milliseconds(10)) ). <\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443.<\/li>\n<li>\u0412 \u0445\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0431\u044b\u0442\u044c \u043d\u0435 \u043b\u0430\u0434\u043d\u043e: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f libevent \u0441\u043e\u043e\u0431\u0449\u0438\u043b\u0430 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0438\u043d\u0443\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043f\u043e\u0442\u043e\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0435 \u0442\u0435\u0445 \u0436\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 C++11 (std::exception_ptr, std::current_exception \u0438 std::rethrow_exception)<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;stdexcept&gt; #include &lt;iostream&gt; #include &lt;memory&gt; #include &lt;chrono&gt; #include &lt;thread&gt; #include &lt;cstdint&gt; #include &lt;vector&gt; #include &lt;evhttp.h&gt;  int main() {   char const SrvAddress[] = &quot;127.0.0.1&quot;;   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, &quot;&lt;html&gt;&lt;body&gt;&lt;center&gt;&lt;h1&gt;Hello Wotld!&lt;\/h1&gt;&lt;\/center&gt;&lt;\/body&gt;&lt;\/html&gt;&quot;);       evhttp_send_reply(req, HTTP_OK, &quot;&quot;, OutBuf);     };     std::exception_ptr InitExcept;     bool volatile IsRun = true;     evutil_socket_t Socket = -1;     auto ThreadFunc = [&] ()     {       try       {         std::unique_ptr&lt;event_base, decltype(&event_base_free)&gt; EventBase(event_base_new(), &event_base_free);         if (!EventBase)           throw std::runtime_error(&quot;Failed to create new base_event.&quot;);         std::unique_ptr&lt;evhttp, decltype(&evhttp_free)&gt; EvHttp(evhttp_new(EventBase.get()), &evhttp_free);         if (!EvHttp)           throw std::runtime_error(&quot;Failed to create new evhttp.&quot;);           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(&quot;Failed to bind server socket.&quot;);           if ((Socket = evhttp_bound_socket_get_fd(BoundSock)) == -1)             throw std::runtime_error(&quot;Failed to get server socket for next instance.&quot;);         }         else         {           if (evhttp_accept_socket(EvHttp.get(), Socket) == -1)             throw std::runtime_error(&quot;Failed to bind server socket for new instance.&quot;);         }         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-&gt;join(); delete t; };     typedef std::unique_ptr&lt;std::thread, decltype(ThreadDeleter)&gt; ThreadPtr;     typedef std::vector&lt;ThreadPtr&gt; ThreadPool;     ThreadPool Threads;     for (int i = 0 ; i &lt; 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 &lt;&lt; &quot;Press Enter fot quit.&quot; &lt;&lt; std::endl;     std::cin.get();     IsRun = false;   }   catch (std::exception const &e)   {     std::cerr &lt;&lt; &quot;Error: &quot; &lt;&lt; e.what() &lt;&lt; std::endl;   }   return 0; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0445\u0430\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u043f\u043e\u0442\u043e\u043a\u0438 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a-\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433\u00bb \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0435 \u0441\u043e\u043a\u0435\u0442\u0430. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430 \u043f\u0443\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0445\u0430\u043a. \u0422\u0430\u043a \u0436\u0435 \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043f\u043e\u0440\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. \u041b\u044f\u043c\u0431\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e\u0431 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0441\u0435 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0434 \u0432 \u0441\u0442\u0438\u043b\u0435 C++03. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u044f\u043c\u0431\u0434\u044b \u0434\u0430\u043b\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u044a\u0435\u043c\u0435 \u043a\u043e\u0434\u0430. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u0434 \u043d\u0435\u0432\u0435\u043b\u0438\u043a, \u0442\u043e \u043b\u044f\u043c\u0431\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0432 \u043d\u0435\u0433\u043e \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u0441 \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u0442\u044c \u043f\u0430\u0433\u0443\u0431\u043d\u043e \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u0443\u0434\u043d\u0438 \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 700 \u0441\u0442\u0440\u043e\u043a \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main.<\/p>\n<p>  \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043e \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0447\u0442\u043e \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ab -c 1000 -k -r -t 10 http:\/\/127.0.0.1:5555\/<\/b><\/p>\n<div class=\"spoiler_text\">Server Software: <br \/>  Server Hostname: 127.0.0.1<br \/>  Server Port: 5555<\/p>\n<p>  Document Path: \/<br \/>  Document Length: 64 bytes<\/p>\n<p>  Concurrency Level: 1000<br \/>  Time taken for tests: 1.576 seconds<br \/>  Complete requests: 50000<br \/>  Failed requests: 0<br \/>  Write errors: 0<br \/>  Keep-Alive requests: 50000<br \/>  Total transferred: 8500000 bytes<br \/>  HTML transferred: 3200000 bytes<br \/>  Requests per second: 31717.96 [#\/sec] (mean)<br \/>  Time per request: 31.528 [ms] (mean)<br \/>  Time per request: 0.032 [ms] (mean, across all concurrent requests)<br \/>  Transfer rate: 5265.68 [Kbytes\/sec] received  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ab -c 1000 -r -t 10 http:\/\/127.0.0.1:5555\/<\/b><\/p>\n<div class=\"spoiler_text\">Server Software: <br \/>  Server Hostname: 127.0.0.1<br \/>  Server Port: 5555<\/p>\n<p>  Document Path: \/<br \/>  Document Length: 64 bytes<\/p>\n<p>  Concurrency Level: 1000<br \/>  Time taken for tests: 3.685 seconds<br \/>  Complete requests: 50000<br \/>  Failed requests: 0<br \/>  Write errors: 0<br \/>  Total transferred: 6300000 bytes<br \/>  HTML transferred: 3200000 bytes<br \/>  Requests per second: 13568.41 [#\/sec] (mean)<br \/>  Time per request: 73.701 [ms] (mean)<br \/>  Time per request: 0.074 [ms] (mean, across all concurrent requests)<br \/>  Transfer rate: 1669.55 [Kbytes\/sec] received<\/p>\n<p>  Connection Times (ms)<br \/>   min mean[\u00b1sd] median max<br \/>  Connect: 0 36 117.2 23 1033<br \/>  Processing: 3 37 10.0 37 247<br \/>  Waiting: 3 30 8.7 30 242<br \/>  Total: 9 73 118.8 61 1089  <\/div>\n<\/div>\n<p>  <\/p>\n<h4>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h4>\n<p>  \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430, \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430\u0446\u0438\u044f \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043e\u043f\u0446\u0438\u0439 \u0442\u0430\u043a \u0436\u0435 \u0435\u0441\u0442\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0434\u043e\u0448\u043b\u0430 \u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0442\u044e\u043d\u0438\u043d\u0433\u043e\u043c.<\/p>\n<p>  \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440:  <\/p>\n<pre><code class=\"cpp\">#include &quot;http_server.h&quot; #include &quot;http_headers.h&quot; #include &quot;http_content_type.h&quot; #include &lt;iostream&gt; int main() {   try   {     using namespace Network;     HttpServer Srv(&quot;127.0.0.1&quot;, 5555, 4,       [&] (IHttpRequestPtr req)       {         req-&gt;SetResponseAttr(Http::Response::Header::Server::Value, &quot;MyTestServer&quot;);         req-&gt;SetResponseAttr(Http::Response::Header::ContentType::Value,                              Http::Content::Type::html::Value);         req-&gt;SetResponseString(&quot;&lt;html&gt;&lt;body&gt;&lt;center&gt;&lt;h1&gt;Hello Wotld!&lt;\/h1&gt;&lt;\/center&gt;&lt;\/body&gt;&lt;\/html&gt;&quot;);       });     std::cout &lt;&lt; &quot;Press Enter for quit.&quot; &lt;&lt; std::endl;     std::cin.get();   }   catch (std::exception const &e)   {     std::cout &lt;&lt; e.what() &lt;&lt; std::endl;   }   return 0; } <\/code><\/pre>\n<p>  \u0412\u0435\u0441\u044c\u043c\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043a\u043e\u0434\u0430 \u0434\u043b\u044f http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 C++. \u0417\u0430 \u0432\u0441\u0435 \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0430. \u0418 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043e\u043f\u043b\u0430\u0447\u0435\u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u0432 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0435 \u043d\u0430\u0434 libevent. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0436\u0435 \u0434\u0435\u043b\u0435 \u043d\u0435\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0427\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0435\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:  <\/p>\n<ul>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 HttpServer. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u043e\u0440\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043b\u044f\u043c\u0431\u0434\u043e\u0439 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430). \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442.<\/li>\n<li>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u043c\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IHttpRequest, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c libevent \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0430\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442.<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IHttpRequest<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace Network {   DECLARE_RUNTIME_EXCEPTION(HttpRequest)    struct IHttpRequest   {     enum class Type     {       HEAD, GET, PUT, POST     };     typedef std::unordered_map&lt;std::string, std::string&gt; 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&lt;IHttpRequest&gt; IHttpRequestPtr; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0435\u0433\u043e \u0442\u0438\u043f, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438), \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0435\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0441\u0430\u043c\u043e \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u0438 \u0435\u0433\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0434\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438), \u043a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 (\u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043b\u0438 \u0444\u0430\u0439\u043b\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442). \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 HttpRequestException.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043a\u043e\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:  <\/p>\n<pre><code class=\"cpp\">req-&gt;SetResponseAttr(Http::Response::Header::Server::Value, &quot;MyTestServer&quot;); req-&gt;SetResponseAttr(Http::Response::Header::ContentType::Value,                      Http::Content::Type::html::Value); <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u0442\u0432\u0435\u0442\u0430, \u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u043a\u0430\u043a \u00abContent-Type\u00bb \u0438 \u00abServer\u00bb. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e libevent \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u0430\u043b\u0435\u043a\u043e \u0437\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 HTTP, \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u043f\u043e\u043b\u0435\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0432 \u043d\u0435\u0439 \u043d\u0435\u0442; \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0434\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 (\u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445). \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435), \u0432\u0441\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0443\u0436\u0435 \u0432 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0435 \u043d\u0430\u0434 libevent.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace Network {   namespace Http   {     namespace Request     {       namespace Header       {         DECLARE_STRING_CONSTANT(Accept, Accept)         DECLARE_STRING_CONSTANT(AcceptCharset, Accept-Charset)         \/\/ ...       }            }          namespace Response     {              namespace Header       {         DECLARE_STRING_CONSTANT(AccessControlAllowOrigin, Access-Control-Allow-Origin)         DECLARE_STRING_CONSTANT(AcceptRanges, Accept-Ranges)         \/\/ ...       }     }   } } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u0432 \u0441\u0442\u0430\u0440\u043e\u043c \u0441\u0442\u0438\u043b\u0435 \u0447\u0438\u0441\u0442\u043e\u0433\u043e C \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u043d\u0435\u0441\u0442\u0438 \u0438\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 .h \u0438 .cpp \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0434\u0435\u043b\u0430\u0432 \u0438\u0445 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0443\u0436\u0435 \u0432 \u0441\u0442\u0438\u043b\u0435 C++. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043f\u043e \u0444\u0430\u0439\u043b\u0430\u043c, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0438\u043b\u0435 C++ \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 (\u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u043d\u043e\u0435 C++ \u0437\u043b\u043e, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u043e\u0437\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u2014 \u0431\u0430\u043b\u044c\u0437\u0430\u043c; \u0433\u0435\u0442\u0435\u0440\u043e\u0433\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e).  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">DECLARE_STRING_CONSTANT<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#define DECLARE_STRING_CONSTANT(name_, value_) \\   namespace Private \\   { \\     template &lt;typename T&gt; \\     struct name_ \\     { \\       static char const Name[]; \\       static char const Value[]; \\     }; \\     template &lt;typename T&gt; \\     char const name_ &lt;T&gt;::Name[] = #name_; \\     template &lt;typename T&gt; \\     char const name_ &lt;T&gt;::Value[] = #value_; \\   } \\   typedef Private:: name_ &lt;void&gt; name_; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041f\u043e\u0447\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430; \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u0411\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043f\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>  \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u0438 \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u044b\u043b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u00ab\u043f\u0435\u0447\u0435\u043d\u044c\u043a\u0438\u00bb, \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"cpp\">std::string Host = req-&gt;GetHeaderAttr(Http::Request::Header::Host::Value); std::string Referer = req-&gt;GetHeaderAttr(Http::Request::Header::Referer::Value); std::string Cookie = req-&gt;GetHeaderAttr(Http::Request::Header::Cookie::Value); <\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 Cookie, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0435\u0433\u043e \u0441\u0435\u0441\u0441\u0438\u0435\u0439 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u0431\u043b\u0443\u0436\u0434\u0430\u043d\u0438\u044f \u043f\u043e \u0412\u0430\u0448\u0435\u043c\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0443 (\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0432 \u043a\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430).<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0432\u043e\u0435 API \u0447\u0435\u0440\u0435\u0437 HTTP, \u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b: \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438. \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0412\u0430\u0448\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre>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<\/pre>\n<p>  \u041e\u0442\u0432\u0435\u0442\u043e\u043c \u043d\u0430 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0442\u0432\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 xml. \u042d\u0442\u043e \u0434\u0435\u043b\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0410 \u0432\u043e\u0442 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0438\u0436\u0435:  <\/p>\n<pre><code class=\"cpp\">auto Path = req-&gt;GetPath(); auto Params = req-&gt;GetParams(); <\/code><\/pre>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u0443\u0442\u0435\u0439 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u044b\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \/service\/login\/OpenSession, \u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u0442\u043e \u043a\u0430\u0440\u0442\u0430 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447 \/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u0438\u043f \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:  <\/p>\n<pre><code class=\"cpp\">typedef std::unordered_map&lt;std::string, std::string&gt; RequestParams; <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0432\u0441\u0435\u0433\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 libevent \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442 \u044d\u0442\u043e\u0439 \u0441\u0430\u043c\u043e\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0438.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 HttpServer<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">namespace Network {   DECLARE_RUNTIME_EXCEPTION(HttpServer)    class HttpServer final     : private Common::NonCopyable   {   public:     typedef std::vector&lt;IHttpRequest::Type&gt; MethodPool;     typedef std::function&lt;void (IHttpRequestPtr)&gt; OnRequestFunc;     enum { MaxHeaderSize = static_cast&lt;std::size_t&gt;(-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-&gt;join(); delete t; };;     typedef std::unique_ptr&lt;std::thread, decltype(ThreadDeleter)&gt; ThreadPtr;     typedef std::vector&lt;ThreadPtr&gt; ThreadPool;     ThreadPool Threads;     Common::BoolFlagInvertor RunFlag;   };  } &lt;\/source&lt;\/spoiler&gt; &lt;spoiler title=&quot;\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 HttpServer&quot;&gt;&lt;source lang=&quot;cpp&quot;&gt; 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&lt;event_base, decltype(&event_base_free)&gt; EventBasePtr;         EventBasePtr EventBase(event_base_new(), &event_base_free);         if (!EventBase)           throw HttpServerException(&quot;Failed to create new base_event.&quot;);         typedef std::unique_ptr&lt;evhttp, decltype(&evhttp_free)&gt; EvHttpPtr;         EvHttpPtr EvHttp(evhttp_new(EventBase.get()), &evhttp_free);         if (!EvHttp)           throw HttpServerException(&quot;Failed to create new evhttp.&quot;);         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(&quot;Failed to bind server socket.&quot;);           if ((Socket = evhttp_bound_socket_get_fd(BoundSock)) == -1)             throw HttpServerException(&quot;Failed to get server socket for next instance.&quot;);         }         else         {           if (evhttp_accept_socket(EvHttp.get(), Socket) == -1)             throw HttpServerException(&quot;Failed to bind server socket for new instance.&quot;);         }         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 &lt; 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);   } } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0441\u043a\u0430\u0447\u0430\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043b\u044f\u043c\u0431\u0434\u0443 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430. \u0422\u0430\u043a \u0436\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IHttpRequest, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043c\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0440\u0443\u0442\u0438\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c libevent. \u0410 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u043e\u0434 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043e\u043d \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e-\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u00ab\u0442\u044e\u043d\u0438\u043d\u0433\u0430\u00bb.<\/p>\n<p>  \u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0438\u043f\u044b http-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e libevent \u0438\u043c\u0435\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e evhttp_set_allowed_methods (\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GET). \u041f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 libevent \u0441\u0430\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.<\/p>\n<p>  \u041f\u044b\u0442\u043b\u0438\u0432\u043e\u0441\u0442\u044c \u0443\u043c\u0430 \u043e\u043d\u0430 \u0431\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u0439: \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0441\u043e\u0437\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435. \u041e\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u044b\u0442\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0443\u043c\u0430 \u0441 \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u00ab\u0437\u0430\u0432\u0430\u043b\u0438\u0442\u044c\u00bb \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0441\u043b\u0430\u0432 \u0435\u043c\u0443 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0435\u043f\u043e\u043c\u0435\u0440\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a http-\u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u043b\u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 evhttp_set_max_headers_size \u0438 evhttp_set_max_body_size. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0431\u0440\u044b\u043c\u0438 \u043f\u043e\u043c\u044b\u0441\u043b\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0438 \u0438\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c\u0438. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u044b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0412\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0430 \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e, \u0447\u0442\u043e \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u2026<\/p>\n<p>  \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b GET (\u043e\u0442\u0434\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438) \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u044b\u043b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &quot;http_server.h&quot; #include &quot;http_headers.h&quot; #include &quot;http_content_type.h&quot; #include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;mutex&gt; int main() {   char const SrvAddress[] = &quot;127.0.0.1&quot;;   std::uint16_t SrvPort = 5555;   std::uint16_t SrvThreadCount = 4;   std::string const RootDir = &quot;..\/test_content&quot;;   std::string const DefaultPage = &quot;index.html&quot;;   std::mutex Mtx;   try   {     using namespace Network;     HttpServer Srv(SrvAddress, SrvPort, SrvThreadCount,       [&] (IHttpRequestPtr req)       {         std::string Path = req-&gt;GetPath();         Path = RootDir + Path + (Path == &quot;\/&quot; ? DefaultPage : std::string());         {           std::stringstream Io;           Io &lt;&lt; &quot;Path: &quot; &lt;&lt; Path &lt;&lt; std::endl              &lt;&lt; Http::Request::Header::Host::Name &lt;&lt; &quot;: &quot;                   &lt;&lt; req-&gt;GetHeaderAttr(Http::Request::Header::Host::Value) &lt;&lt; std::endl              &lt;&lt; Http::Request::Header::Referer::Name &lt;&lt; &quot;: &quot;                   &lt;&lt; req-&gt;GetHeaderAttr(Http::Request::Header::Referer::Value) &lt;&lt; std::endl;           std::lock_guard&lt;std::mutex&gt; Lock(Mtx);           std::cout &lt;&lt; Io.str() &lt;&lt; std::endl;         }         req-&gt;SetResponseAttr(Http::Response::Header::Server::Value, &quot;MyTestServer&quot;);         req-&gt;SetResponseAttr(Http::Response::Header::ContentType::Value,                              Http::Content::TypeFromFileName(Path));         req-&gt;SetResponseFile(Path);       });     std::cin.get();   }   catch (std::exception const &e)   {     std::cout &lt;&lt; e.what() &lt;&lt; std::endl;   }   return 0; } <\/code><\/pre>\n<\/div>\n<\/div>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 libevent \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0412 \u043e\u0431\u0449\u0435\u043c: \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u0447\u0435\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043e \u0447\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0435 \u043c\u0430\u043b\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 http-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u0432\u0437\u044f\u0442 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0440\u0443\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u0435\u0440\u0432\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b <a href=\"http:\/\/t-boss.ru\/libevent_test_http_srv.zip\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 zip-\u0430\u0440\u0445\u0438\u0432\u0430<\/a>. \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0432 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0438\u0445 \u0436\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u043c\u043d\u043e\u0439 \u0431\u044b\u043b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u043f\u043e\u0441\u0442 <a href=\"http:\/\/habrahabr.ru\/post\/164699\/\">\u00ab\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 C++ 11\u00bb<\/a>. \u0412 \u043b\u0438\u0447\u043a\u0443 \u0431\u044b\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0435\u0449\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043c\u043e\u0435\u043c \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0438 \u0442.\u00a0\u0434. \u0438 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 <a href=\"http:\/\/t-boss.ru\/\">\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441<\/a> \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u0414\u0438\u0437\u0430\u0439\u043d\u0435\u0440 \u0438\u0437 \u043c\u0435\u043d\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u0437\u0430 \u0434\u0438\u0437\u0430\u0439\u043d \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0448\u0443 \u043d\u0435 \u0436\u0443\u0440\u0438\u0442\u044c \ud83d\ude42 \u041d\u0430\u043a\u0438\u0434\u0430\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0438 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0433\u043e \u0447\u0435\u043c-\u0442\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c. \u0414\u0430, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 nginx \u0438\u043b\u0438 apache, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u0435\u0449\u0435 \u0447\u0442\u043e-\u0442\u043e. \u041d\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u044e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b http-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0432 \u043f\u043e\u0441\u0442\u0435 \u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u00ab\u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0433\u043e\u00bb http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0418 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u043c \u00ab\u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0430\u0445\u00bb (\u043a\u0430\u043a \u0438\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043b\u044e\u0431\u044f\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u044f\u0445 \u0438 \u0442.\u00a0\u0434.) \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0438 \u0442.\u00a0\u0434. \u0441\u0430\u0439\u0442 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u0447\u0442\u0438 \u043c\u0435\u0441\u044f\u0446. \u041f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438 \u0431\u0435\u0437 \u043f\u0430\u0434\u0435\u043d\u0438\u0439. \u0425\u0430\u0431\u0440\u0430\u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e. \u0414\u0430 \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0435\u043c\u0443 \u0432\u0437\u044f\u0442\u044c\u0441\u044f. \u0410 \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u044f \u043f\u0435\u0440\u0435\u0432\u0435\u043b \u0432\u044b\u0434\u0430\u0447\u0443 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u0441\u0442\u0430, \u0442\u0430\u043c \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u0438 \u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0412\u044b\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0445\u0430\u0431\u0440\u0430\u044d\u0444\u0444\u0435\u043a\u0442\u0430? \u041d\u0435 \u0437\u043d\u0430\u044e. \u0412\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0442, \u0430 \u0432\u043e\u0442 \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u043c\u043e\u044f VDS&#8217;\u043a\u0430 (2 \u044f\u0434\u0440\u0430, 1\u0413\u0431 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u041e\u0421 \u2014 Ubuntu 12.04 64bit) \u0443\u0436\u0435 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u044e\u0441\u044c \u0441\u043a\u0430\u0437\u0430\u0442\u044c. \u0410 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043b\u0438 \u0441\u0430\u043c \u0445\u0430\u0431\u0440\u0430\u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430 \u044d\u0442\u043e \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f. \u041f\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0441\u0435\u0442\u0438 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0430 \u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043c\u043e\u0435\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ab -c 1000 -k -r -t 10 http:\/\/t-boss.ru\/libevent_test_http_srv.zip<\/b><\/p>\n<div class=\"spoiler_text\">Server Software: t-boss<br \/>  Server Hostname: t-boss.ru<br \/>  Server Port: 80<\/p>\n<p>  Document Path: \/libevent_test_http_srv.zip<br \/>  Document Length: 23756 bytes<\/p>\n<p>  Concurrency Level: 1000<br \/>  Time taken for tests: 10.012 seconds<br \/>  Complete requests: 2293<br \/>  Failed requests: 0<br \/>  Write errors: 0<br \/>  Keep-Alive requests: 2293<br \/>  Total transferred: 60628847 bytes<br \/>  HTML transferred: 60328370 bytes<br \/>  Requests per second: 229.02 [#\/sec] (mean)<br \/>  Time per request: 4366.365 [ms] (mean)<br \/>  Time per request: 4.366 [ms] (mean, across all concurrent requests)<br \/>  Transfer rate: 5913.65 [Kbytes\/sec] received  <\/div>\n<\/div>\n<p>  \u0414\u0432\u0435 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0442\u044b\u0441\u044f\u0447\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u0430 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u0442\u0430 \u0437\u0430 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434. \u041a\u0440\u043e\u043c\u0435 \u0441\u0430\u043c\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447: \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u0438\u043b\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442.\u00a0\u0434. \u041f\u043e\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442 \u0438 \u044d\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 memcached, berkeley db \u0438 \u0438\u043d\u044b\u043c\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 C++ \u0438 \u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. <\/p>\n<p>  \u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<h4>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h4>\n<p>  <\/p>\n<ul>\n<li><a href=\"http:\/\/libevent.org\/\">libevent<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/152345\/\">WebServer \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"http:\/\/ru.wikipedia.org\/wiki\/HTTP\">HTTP<\/a><\/li>\n<li><a href=\"http:\/\/en.wikipedia.org\/wiki\/List_of_HTTP_header_fields\">List of HTTP header fields<\/a><\/li>\n<\/ul>\n<p>      \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/217437\/\"> http:\/\/habrahabr.ru\/post\/217437\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/0c3\/ee5\/939\/0c3ee593920d23b63192407b9045eef1.jpg\" align=\"left\"\/> \u041f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0425\u0430\u0431\u0440, \u044f \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e \u043f\u043e\u0441\u0442\u044b \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 C++ \u0438\u043b\u0438 \u043d\u0430 \u0438\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 C++ \u0438\u0437 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u0433 \u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438 \u0447\u0438\u0442\u0430\u044e. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043f\u043e\u043b\u0438\u0441\u0442\u0430\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u00ab\u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0430\u0445\u00bb, \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c boost.asio \u0438\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0435\u0449\u0435. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u044f \u0442\u0430\u043a \u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u043f\u043e\u0441\u0442 \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f. \u041d\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043e\u043d\u044b\u043c \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0440\u0430\u0434\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 libevent \u0438 boost.asio \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438. \u0410 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043a-\u0442\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<p>  \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u043a\u0430\u043a-\u0442\u043e \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b libevent \u0438 libev. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u043a\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e http-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 libevent, \u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432 C++11 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 http-\u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u0435\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 40 \u0441\u0442\u0440\u043e\u043a.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-217437","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/217437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=217437"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/217437\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=217437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=217437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=217437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}