рдиреЗрд╕реНрдЯреЗрдб рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдХреЙрдиреНрд╕реЗрдкреНрдЯ, log4cpp рдФрд░ Boost asio

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк log4cpp рдФрд░ boost.tio рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ NDC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ: рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдИрдбреА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЛ рд╕реМрдВрдк рджреЗрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ:




рддреИрдпрд╛рд░реА рд╢реБрд░реВ рдХрд░реЗрдВ



рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг

рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрд╢рди рд╕рд┐рджреНрдзрд╛рдВрдд:


рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


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

рдЙрджрд╛рд╣рд░рдг рдХрдиреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд┐рдо рдирд┐рдпрдВрддреНрд░рдг рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдПрдХ рд╕рд╣реА рд╕реНрдЯреЙрдк рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдирдбреАрд╕реА рдХреА рд╕рд╣реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП)ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред

рд╣рдо рдПрдирдбреАрд╕реА рдХреЗ рдмрд┐рдирд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

рдпрджрд┐ рд╣рдо рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рд░рд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ (рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП) рдХреА рд╕реНрдХреНрд░реАрди рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рджреЗрдЦреЗрдВрдЧреЗ:
17 INFO connection status: system:0, message: Success 17 INFO starting asynchronous reading... ... 33 INFO answer from server readed: [552] 33 INFO starting asynchronous timeout 00:00:00.552000 ... ... 141 INFO timer status: system:0, message: Success 141 INFO starting asynchronous write... 141 INFO write status: system:0, message: Success, bytes written: 8 

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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╡рд░рдг

рдкрд╣рд▓реЗ, log4cpp рдореЗрдВ NDC рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреИрдЯрд░реНрдирдХреЙрд▓рдЖрдЙрдЯ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕реЗрдЯрдХреЛрд╡рд░реНрд╕рдирдкреИрдЯрд░реНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╣рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред % X рдкреИрд░рд╛рдореАрдЯрд░ NDC рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ (рджреЗрдЦреЗрдВ consts :: ndcLayoutPattern рдЖрдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ)

рд╡рд┐рдХрд▓реНрдк # 1

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪрд╛рд░ рдорди рдореЗрдВ рдЖрддрд╛ рд╣реИ: рдЪреВрдВрдХрд┐ asio рдХрд┐рд╕реА рднреА рдХрдВрдкреНрд▓реАрд╢рдирд╣реИрдВрдбрд▓рд░ (рдЬреЛ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ ) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрдкрдиреЗ рдХрдореНрдкреНрд▓реАрд╢рдирд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:
 struct NdcHolder : private boost::noncopyable { NdcHolder(const std::string & ndc) { log4cpp::NDC::push(ndc); } ~NdcHolder() { log4cpp::NDC::pop(); } }; //... template <typename Oldhandler> void newHandler(OldHandler func, const std::string & ndc) { NdcHolder ndcHolder(ndc); func(); } 

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

рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдирдбреАрд╕реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж NDC рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╣рдо рд▓реЙрдЧ рдореЗрдВ рдЕрдорд╛рдиреНрдп NDC рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ


рд╡рд┐рдХрд▓реНрдк # 2

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

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

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмреВрд╕реНрдЯ / asio / handler_invoke_hook.hpp рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 template <typename Function> inline void asio_handler_invoke(Function function, ...) { function(); } 

рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рдмреВрд╕реНрдЯ / asio / рдбрд┐рдЯреЗрд▓ / рд╣реИрдВрдбрд▓рд░_invoke_helpers.hpp рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдереНрд░реЛ рдбреНрд░реЛрд╕реЛрдлрд░реНрд╕ :
 template <typename Function, typename Context> inline void invoke(Function& function, Context& context) { using boost::asio::asio_handler_invoke; asio_handler_invoke(function, boost::addressof(context)); } 


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

рдЖрдЗрдП рд╣реИрдВрдбрд▓рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
 template <typename HandlerT> class NdcDecorator { public: explicit NdcDecorator(HandlerT handler, const std::string & ndc) : mHandler(handler), mNdc(ndc) {} void operator()() { mHandler(); } template <typename Arg1> void operator() (Arg1 arg1) { mHandler(arg1); } template <typename Arg1, typename Arg2> void operator() (Arg1 arg1, Arg2 arg2) { mHandler(arg1, arg2); } const std::string & ndc() const { return mNdc; } private: HandlerT mHandler; std::string mNdc; }; 

рдЖрд╕рд┐рдпреЛ рдХреЛ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

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

рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде asio_handler_invoke рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 template <typename FunctionT, typename HandlerT> void asio_handler_invoke(FunctionT func, NdcDecorator<HandlerT> * ndcHandler) { NdcHolder ndcHolder(ndcHandler->ndc()); func(); } 

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

рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП asio рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдорд┐рдд рд╣реИрдВрдбрд▓рд░ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ asio_handler_invoke рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝рдиреЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 mSocket->async_read_some(to_asio_buffer(mInputMsg), boost::bind(&server_connection::onRead, shared_from(this), placeholders::error, placeholders::bytes_transferred)); 

рдпрд╣рд╛рдВ рд╣рдо рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рддреЗ рд╣реИрдВ :: рдмрд╛рдЗрдВрдбред рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдЬрд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ NdcDecorator рдореЗрдВ рдмрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдкреЗрдЯреЗрдВ :
 mSocket->async_read_some(to_asio_buffer(mInputMsg), decorate( boost::bind(&server_connection::onRead, shared_from(this), placeholders::error, placeholders::bytes_transferred))); 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдкрд░рд┐рд╡рд░реНрддрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ - рдЕрд░реНрдерд╛рддреН, рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд╣ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ NDC рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:
 template <typename HandlerT> NdcDecorator<HandlerT> decorate(HandlerT handler, const std::string & ndc = log4cpp::NDC::get()) { return NdcDecorator<HandlerT>(handler, ndc); } 

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

рд╣рдо рдПрдирдбреАрд╕реА рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

рдЕрдм рд╣рдо ndc (рд╕рд░реНрд╡рд░) рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
 9179 INFO starting asynchronous write... <SID=1> 9179 INFO starting asynchronous accept... 9179 INFO write status: system:0, message: Success, bytes written: 4 <SID=1> 9179 INFO starting asynchronous timeout 00:00:00.765000 ... <SID=1> ... 9595 INFO read status: system:0, message: Success <SID=3> 9595 INFO answer from client readed: [GOODBYE] <SID=3> 9595 INFO timer status: system:0, message: Success <SID=65> 9595 INFO starting asynchronous read... <SID=65> 9598 INFO read status: system:0, message: Success <SID=12> 9598 INFO answer from client readed: [GOODBYE] <SID=12> 


рд╕рд░реНрд╡рд░ рд▓реЙрдЧ рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдСрдкрд░реЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП grep:
 cat ndc_server.log | grep "<SID=50>" > 50.log 

 9199 INFO starting asynchronous write... <SID=50> 9199 INFO write status: system:0, message: Success, bytes written: 4 <SID=50> 9199 INFO starting asynchronous timeout 00:00:00.879000 ... <SID=50> 10079 INFO timer status: system:0, message: Success <SID=50> 10079 INFO starting asynchronous read... <SID=50> 10100 INFO read status: system:0, message: Success <SID=50> 10100 INFO answer from client readed: [GOODBYE] <SID=50> 


рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп рдХреА рд╕реВрдЪреА:

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


All Articles