рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рдЬреЙрди рдЯреЛрд░рдЬреЛ рдХреА рдкреБрд╕реНрддрдХ Boost.Asio C ++ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рджреВрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рд╕рд╛рдордЧреНрд░реА:
рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдЖрдкрдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдореЗрдВ рдпрд╣ рдЦрдВрдб рдЧрд╣рд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рд╕реЛрдЪрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдП рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╣рддреЗ рд╣реИрдВ, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдмреА рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣, рддрд╛рдХрд┐ рд╣рдо рдШрдЯрдирд╛-рд╣реИрдВрдбрд▓рд░ рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдЪ рд╕рдХреЗрдВ)ред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╛рдВрдЪ рдШрдЯрдирд╛рдПрдВ рдФрд░ рдЖрдк рдХрднреА рднреА рдЙрд╕ рдХреНрд░рдо рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдкрддрд╛ рднреА рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рд╕рднреА рдкреВрд░реЗ рд╣реЛрдВрдЧреЗ!
рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ, рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ, рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдЧреНрд░рд╛рд╣рдХ рд╣реИрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рде 1000 рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рддрдХ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдХреИрд░реЗрдХреНрдЯрд░ 'n' рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб, 1 рдзрд╛рдЧрд╛:
using namespace boost::asio; struct client { ip::tcp::socket sock; char buff[1024];
рд╕рд░реНрд╡рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдИ рднреА рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдХреЛрдб рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐
handle_clients()
рдлрд╝рдВрдХреНрд╢рди рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рдЕрд╡рд░реБрджреНрдз рд╣реЛред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдВрджреЗрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдирд▓реЙрдХ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд╕реЙрдХреЗрдЯ рд╕реЗ рдкрдврд╝реЗрдВрдЧреЗ рдЬрдм рдЙрд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рд╡рд╣ рд╣реИ,
if ( clients[i].sock.available() ) on_read(clients[i])
ред On_read рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЙрддрдирд╛ рд╣реА рдкрдврд╝реЗрдВрдЧреЗ рдЬрд┐рддрдирд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ;
read_until(c.sock, buffer(...),'\n')
рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддрдм рддрдХ рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрдврд╝рддреЗ рд╣реИрдВ (рд╣рдо рдХрднреА рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХрдм рд╣реЛрдЧрд╛) ред
рдпрд╣рд╛рдВ рдЕрдбрд╝рдЪрди
on_read_msg()
рдлрд╝рдВрдХреНрд╢рди рд╣реИ; рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рд╕рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдлрд╝рдВрдХреНрд╢рди
on_read_msg()
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХрднреА-рдХрднреА рд╕реЙрдХреЗрдЯ рдкрд░ рд▓рд┐рдЦрдирд╛ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЗрд╕рдХрд╛ рдмрдлрд░ рднрд░рд╛ рд╣реБрдЖ рд╣реИ)ред
рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб, 10 рдзрд╛рдЧреЗ:
using namespace boost::asio; struct client {
рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐
set_reading
() рдФрд░
set_unreading()
рдлрд╝рдВрдХреНрд╢рди рдХрд░рддреЗ рд╣реИрдВред
set_reading()
рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЖрдк "рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдПрдХ рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рд╣реИ ("рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ" рдФрд░ "рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ"), рддреЛ рдЖрдк рджреЛ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП
on_read
рдХреА
on_read
рд▓рд┐рдП, рджреВрд╕рд░рд╛ рдЙрд╕реА рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП
on_read
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ, рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рд╕рд┐рд╕реНрдЯрдо рдХреНрд░реИрд╢ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдб рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдПрдХ рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдкреНрд░рддрд┐ рдЧреНрд░рд╛рд╣рдХ рдПрдХ рдзрд╛рдЧрд╛ред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд╕рд╛рде-рд╕рд╛рде рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рддреА рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдПрдХ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдСрдкрд░реЗрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдордиреЗ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ред рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рддреЛ
on_read
рдСрдкрд░реЗрд╢рди
on_read
, рд╣рдо рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдПрдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реАрдб рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ)ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб, 10 рдзрд╛рдЧреЗ:
using namespace boost::asio; io_service service; struct client { ip::tcp::socket sock; streambuf buff;
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдб рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред
client
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рд╕рджрд╕реНрдп рд╣реИрдВ,
handle_clients()
рд╕рд┐рд░реНрдл
handle_clients()
рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджрд╕ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓
service.run()
ред рдпреЗ рдзрд╛рдЧреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗред рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐
on_read()
рдлрд╝рдВрдХреНрд╢рди рд▓рдЧрд╛рддрд╛рд░ рдЕрдЧрд▓реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ (рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рджреЗрдЦреЗрдВ)ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдЪрд▓рддреЗ рд╣реИрдВ (), run_one (), poll (), poll_one ()
рдПрдХ рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рд▓реВрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
io_service
рд╡рд░реНрдЧ рдЪрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ
run(), run_one(), poll()
, рдФрд░
poll_one()
ред рдпрджреНрдпрдкрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЖрдк
service.run()
рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред рдпрд╣рд╛рдВ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдорджрдж рд╕реЗ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдПрдХ рдмрд╛рд░ рдлрд┐рд░,
run()
рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдпрд╛ рдЬрдм рддрдХ рдЖрдк рд╕реНрд╡рдпрдВ
io_service::stop()
рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╡реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
using namespace boost::asio; io_service service; ip::tcp::socket sock(service); char buff_read[1024], buff_write[1024] = "ok"; void on_read(const boost::system::error_code &err, std::size_t bytes) ; void on_write(const boost::system::error_code &err, std::size_t bytes) { sock.async_read_some(buffer(buff_read), on_read); } void on_read(const boost::system::error_code &err, std::size_t bytes) {
рдЬрдм
service.run()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрдм рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ
on_connect
рд╣реИ, рддреЛ
on_connect
, рдЬреЛ рдПрдХ рдЕрдиреНрдп рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред
on_connect
рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдЕрдиреБрд╕реВрдЪрд┐рдд рдСрдкрд░реЗрд╢рди (
read
) рд╣реИред рдЬрдм
on_read
рдСрдкрд░реЗрд╢рди
on_read
, рддреЛ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдПрдХ рдФрд░ рдЕрдиреБрд╕реВрдЪрд┐рдд рдСрдкрд░реЗрд╢рди (
write
) рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм
on_write
рдлрд╝рдВрдХреНрд╢рди рдХреЛ
on_write
, рддреЛ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЕрдиреНрдп рдЕрдиреБрд╕реВрдЪрд┐рдд рдСрдкрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЬрдм
on_write
рдлрд╝рдВрдХреНрд╢рди
on_write
, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреБрд╕реВрдЪрд┐рдд рдСрдкрд░реЗрд╢рди (
read
) рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЪрдХреНрд░ рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓реЗрддреЗред
рдХрд╛рд░реНрдп run_one (), рдЬрдирдордд (), poll_one ()
рдпрд╣ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЙрд╕реА рдереНрд░реЗрдб рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
io_service::run
рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдпрд╣ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рд╕реЗ рдХрдо 90 рд╕реЗ 95 рдкреНрд░рддрд┐рд╢рдд рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
run_one(), poll()
, рдпрд╛
poll_one()
рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреА
run_one(), poll()
рд╕рдЪ рд╣реИред
run_one()
рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рднреЗрдЬреЗрдЧрд╛:
- рдпрджрд┐ рдХреЛрдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ 0 рджреЗрддрд╛ рд╣реИ
- рдпрджрд┐ рд▓рдВрдмрд┐рдд рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 1 рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордХрдХреНрд╖ рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
io_service service; service.run();
рдЖрдк рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
run_once()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
io_service service; bool write_complete = false; void on_write(const boost::system::error_code & err, size_t bytes) { write_complete = true; } ... std::string data = "login ok"; write_complete = false; async_write(sock, buffer(data), on_write); do service.run_once() while (!write_complete);
рдРрд╕реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИрдВ рдЬреЛ
run_one()
рд╕рд╛рде рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП
run_one()
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП block_tcp_client.cpp рдФрд░ block_udp_client.cppред
poll_one
рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдВрдмрд┐рдд рдСрдкрд░реЗрд╢рди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ:
- рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд▓рдВрдмрд┐рдд рдСрдкрд░реЗрд╢рди, рдмрд┐рдирд╛ рдЕрд╡рд░реЛрдз рдХреЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ
run_one()
рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ рдФрд░ 1 рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ - рдЕрдиреНрдпрдерд╛, рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдФрд░ 0 рджреЗрддрд╛ рд╣реИред
рдПрдХ рд▓рдВрдмрд┐рдд рдСрдкрд░реЗрд╢рди, рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрд╡рд░реЛрдз рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
- рдПрдХ рдЯрд╛рдЗрдорд░ рдЬреЛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ
async_wait
рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХ I / O рдСрдкрд░реЗрд╢рди рдЬреЛ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
async_read
) рдФрд░ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд░ рдЬреЛ рдкрд╣рд▓реЗ
io_services
рдЙрджрд╛рд╣рд░рдг io_services
рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ (рдЗрд╕реЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)
рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ / рдУ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП
poll_one
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
io_service service; while ( true) {
poll()
рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛ рдЬреЛ рд▓рдВрдмрд┐рдд рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдЪрд▓рд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рдорддреБрд▓реНрдп рд╣реИ:
io_service service; service.poll();
рдкрд┐рдЫрд▓реЗ рд╕рднреА рдХрд╛рд░реНрдп
boost::system::system_error
рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
boost::system::system_error
ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП; рдпрд╣рд╛рдВ рдлреЗрдВрдХреА рдЧрдИ рддреНрд░реБрдЯрд┐ рдЖрдорддреМрд░ рдкрд░ рджреБрд░реНрдШрдЯрдирд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрд╕рд╛рдзрди рддреНрд░реБрдЯрд┐ рд╣реЛ рдпрд╛ рдЖрдкрдХреЗ рдХрд┐рд╕реА рд╣реИрдВрдбрд▓рд░ рдиреЗ рдЕрдкрд╡рд╛рдж рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реЛред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЕрдзрд┐рднрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
boost::system::error_code
рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
io_service service; boost::system::error_code err = 0; service.run(err); if ( err) std::cout << "Error " << err << std::endl;
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди
рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рди рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╣реИ, рд╕реЙрдХреЗрдЯ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реАрдбрд┐рдВрдЧ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЖрдк рдЙрд╕ рдЖрджреЗрд╢ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдорддреМрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ / рд╕реЙрдХреЗрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ) рд╣реИрдВред рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП
service.post()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
#include <boost/thread.hpp> #include <boost/bind.hpp> #include <boost/asio.hpp> #include <iostream> using namespace boost::asio; io_service service; void func(int i) { std::cout << "func called, i= " << i << std::endl; } void worker_thread() { service.run(); } int main(int argc, char* argv[]) { for ( int i = 0; i < 10; ++i) service.post(boost::bind(func, i)); boost::thread_group threads; for ( int i = 0; i < 3; ++i) threads.create_thread(worker_thread); // wait for all threads to be created boost::this_thread::sleep( boost::posix_time::millisec(500)); threads.join_all(); }
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
service.post(some_function)
рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рдПрдХ
io_service
рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
service.run()
рдХрд╣рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рддреАрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдмрдирд╛рдпрд╛ред рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рдЙрдирд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ (
post()
) рдЬреЛрдбрд╝рд╛ рдерд╛ред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
func called, i= 0 func called, i= 2 func called, i= 1 func called, i= 4 func called, i= 3 func called, i= 6 func called, i= 7 func called, i= 8 func called, i= 5 func called, i= 9
рдПрдХ рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд░реЗрд╕реНрддрд░рд╛рдВ рдореЗрдВ рдЬрд╛рдирд╛ рд╣реИ (
go_to_restaurant
), рдПрдХ
order
рдФрд░ рдЦрд╛рдПрдВ (
eat
)ред рдЖрдк рдкрд╣рд▓реЗ рд░реЗрд╕реНрддрд░рд╛рдВ рдореЗрдВ рдЖрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдПрдХ рдСрд░реНрдбрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЦрд╛рдирд╛ рдЦрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
io_service::strand
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
using namespace boost::asio; io_service service; void func(int i) { std::cout << "func called, i= " << i << "/" << boost::this_thread::get_id() << std::endl; } void worker_thread() { service.run(); } int main(int argc, char* argv[]) { io_service::strand strand_one(service), strand_two(service); for ( int i = 0; i < 5; ++i) service.post( strand_one.wrap( boost::bind(func, i))); for ( int i = 5; i < 10; ++i) service.post( strand_two.wrap( boost::bind(func, i))); boost::thread_group threads; for ( int i = 0; i < 3; ++i) threads.create_thread(worker_thread);
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реА рдкрд╛рдБрдЪ рдФрд░ рдЕрдВрддрд┐рдо рдкрд╛рдБрдЪ рд╕реНрдЯреНрд░реАрдо рдЖрдИрдбреА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН,
func called, i = 0
рдХреЛ
func called, i = 1
рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ
func called, i = 2
рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рд╡рд╣реА
func called, i = 5
рд▓рд┐рдП рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ
func called, i = 5
рдЬреЛ рдХрд┐
func called, i = 6
рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛
func called, i = 6
рдФрд░
func called, i = 6
рдХреЛ
func called, i = 7
рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рднрд▓реЗ рд╣реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдореЗрдВ рдмреБрд▓рд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
func called, i= 0/002A60C8 func called, i= 5/002A6138 func called, i= 6/002A6530 func called, i= 1/002A6138 func called, i= 7/002A6530 func called, i= 2/002A6138 func called, i= 8/002A6530 func called, i= 3/002A6138 func called, i= 9/002A6530 func called, i= 4/002A6138
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреЛрд╕реНрдЯ () рдмрдирд╛рдо рдкреНрд░реЗрд╖рдг () рдмрдирд╛рдо рд░реИрдк ()
Boost.Asio рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
service.post(handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП io_service
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж io_service
ред рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрд╛рдж рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ service.run()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИредservice.dispatch(handler)
: рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП io_service
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ, рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ service.run()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИредservice.wrap(handler)
: рдпрд╣ рдлрдВрдХреНрд╢рди рдПрдХ рд░реИрдкрд░ рдлрдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ service.dispatch(handler)
ред рдпрд╣ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдореИрдВ рдЬрд▓реНрдж рд╣реА рдЗрд╕рдХрд╛ рдорддрд▓рдм рдмрддрд╛рдКрдВрдЧрд╛ред
рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ
service.post()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рд╕рд╛рде рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрд╛ред рдЗрд╕реЗ рдмрджрд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐
service.dispatch
рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ:
using namespace boost::asio; io_service service; void func(int i) { std::cout << "func called, i= " << i << std::endl; } void run_dispatch_and_post() { for ( int i = 0; i < 10; i += 2) { service.dispatch(boost::bind(func, i)); service.post(boost::bind(func, i + 1)); } } int main(int argc, char* argv[]) { service.post(run_dispatch_and_post); service.run(); }
рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдмрддрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдХрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
func called, i= 0 func called, i= 2 func called, i= 4 func called, i= 6 func called, i= 8 func called, i= 1 func called, i= 3 func called, i= 5 func called, i= 7 func called, i= 9
рдкрд╣рд▓реЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрдЦреНрдпрд╛рдПрдВ рднреА рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡рд┐рд╖рдоред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░
post()
рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
dispatch()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
dispatch()
рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛рдПрдБ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
dispatch()
рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдиреЗ
service.run()
рдХрд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкреЛрд╕реНрдЯ () рдЕрднреА рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
service.wrap(handler)
ред рд░реИрдк () рдПрдХ рдлрд╝рдирдХрд╛рд░ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
using namespace boost::asio; io_service service; void dispatched_func_1() { std::cout << "dispatched 1" << std::endl; } void dispatched_func_2() { std::cout << "dispatched 2" << std::endl; } void test(boost::function<void()> func) { std::cout << "test" << std::endl; service.dispatch(dispatched_func_1); func(); } void service_run() { service.run(); } int main(int argc, char* argv[]) { test( service.wrap(dispatched_func_2)); boost::thread th(service_run); boost::this_thread::sleep( boost::posix_time::millisec(500)); th.join(); }
рд╕реНрдЯреНрд░рд┐рдВрдЧ
test(service.wrap(dispatched_func_2));
рдбрд┐рд╕реНрдкреИрдЪ_рдлрдВрдЪc_2 рдХреЛ рд▓рдкреЗрдЯреЗрдВрдЧреЗ рдФрд░ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдмрдирд╛рдпреЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ
test
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрдм
test()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЙрд▓ рдХреЛ
func()
рдФрд░ рдХреЙрд▓
func()
рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ
func()
service.dispatch(dispatched_func_2)
рдмрд░рд╛рдмрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ:
test dispatched 1 dispatched 2
io_service::strand
рдХреНрд▓рд╛рд╕ (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдореЗрдВ рдлрдВрдХреНрд╢рди
poll(), dispatch()
рдФрд░
wrap()
ред рдЙрдирдХрд╛ рдЕрд░реНрде
poll(), dispatch()
рдФрд░
wrap()
io_service
ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЖрдк рдХреЗрд╡рд▓
io_service::strand::wrap()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ
io_service::poll()
рдпрд╛
io_service::dispatch()
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗред
рдЬрд┐рдВрджрд╛ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП
рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдСрдкрд░реЗрд╢рди рдХрд░рдХреЗ рдХрд╣реЗрдВрдЧреЗ:
io_service service; ip::tcp::socket sock(service); char buff[512]; ... read(sock, buffer(buff));
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
sock
рдФрд░
buff
рджреЛрдиреЛрдВ рдХреЛ
read()
рдХреЙрд▓ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ
read()
рдХреЙрд▓ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╡реИрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрд░реНрдХ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЬрдм рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЪреАрдЬреЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ:
io_service service; ip::tcp::socket sock(service); char buff[512]; void on_read(const boost::system::error_code &, size_t) {} ... async_read(sock, buffer(buff), on_read);
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
sock
рдФрд░
buff
рдХреЛ рд╕реНрд╡рдпрдВ
read
рдСрдкрд░реЗрд╢рди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХрдм рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред
рд╕реЙрдХреЗрдЯ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЗ рдкрд╛рд╕
buffer
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рд╕реЗ рдмрдЪ рдЧрдпрд╛ рдерд╛ (
boost::shared_array<>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
boost::shared_array<>
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЙрдХреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдкрдврд╝рд╛ / рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдо
boost::bind
рджреЗрддреЗ рд╣реИрдВ
boost::bind
рдПрдХ рд╕рд╛рдЭрд╛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдлрдиреНрдбрд░ рдХреЛ
boost::bind
:
using namespace boost::asio; io_service service; struct connection : boost::enable_shared_from_this<connection> { typedef boost::system::error_code error_code; typedef boost::shared_ptr<connection> ptr; connection() : sock_(service), started_(true) {} void start(ip::tcp::endpoint ep) { sock_.async_connect(ep, boost::bind(&connection::on_connect, shared_from_this(), _1)); } void stop() { if ( !started_) return; started_ = false; sock_.close(); } bool started() { return started_; } private: void on_connect(const error_code & err) {
рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдореЗрдВ,
boost::bind
рдлрд╝рдиреНрдХреНрдЯрд░ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдирдХрд╛рд░ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ
connection
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЭрд╛ рдкреЙрдЗрдВрдЯрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд▓рдВрдмрд┐рдд рд╣реИ, Boost.Asio
boost::bind
рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛
boost::bind
рдлрд╝рдирдХрд╛рд░, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ
connection
рд▓рд┐рдП рдПрдХ рд╕рд╛рдЭрд╛ рд╕реВрдЪрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ!
рдмреЗрд╢рдХ,
connection
рд╡рд░реНрдЧ рд╕рд┐рд░реНрдл
skeleton
рд╡рд░реНрдЧ рд╣реИ; рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджрд┐рдЦреЗрдЧрд╛)ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди
connection::ptr(new connection)->start(ep)
рдмрдирд╛рддреЗ рд╣реИрдВ
connection::ptr(new connection)->start(ep)
ред рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ (рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕) рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
stop()
ред
рдПрдХ рдмрд╛рд░ рдЙрджрд╛рд╣рд░рдг рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рд╣реИ (
start()
), рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЬрдм рдХреЛрдИ рдХрдиреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ
on_connect()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рд░реАрдб рдСрдкрд░реЗрд╢рди (
do_read()
) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рд░реАрдб рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рдВрджреЗрд╢ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛
on_read()
рдЕрд▓рдЧ
on_read()
ред рдЬрдм рдЖрдк рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдлрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐
do_write()
рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдлрд┐рд░ рд╕реЗ, рдмрдлрд░ рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░рд╛рдЗрдЯ рдСрдкрд░реЗрд╢рди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЖрдЦрд┐рд░реА рдиреЛрдЯ - рдЬрдм рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рддрдирд╛ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкреВрд░реЗ рдмрдлрд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рд░рд╛рдВрд╢
рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреАрдЖрдИ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИред рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдЙрд╕ рд╕рдордп рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
Boost.Asio рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдЖрдИрдкреА рдкрддреЗ рдФрд░ рдкреЛрд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдЯреАрдХ рдЖрдИрдкреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдЖрдИрдкреА рдкрддреЗ рдХреЗ рдмрдЬрд╛рдп
www.yahoo.com рдЬреИрд╕реЗ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
resolver
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдордиреЗ рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рднреА рджреЗрдЦрд╛ рдЬреЛ рдХреЛрд░ рдПрдкреАрдЖрдИ рдореЗрдВ рд╣реИрдВред Boost.Asio рдЯреАрд╕реАрдкреА, рдпреВрдбреАрдкреА рдФрд░ рдЖрдИрд╕реАрдПрдордкреА рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджрд┐рд▓ рдХреЗ рдмреЗрд╣реЛрд╢ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдмреБрд░рд╛рдИ рд╣реИред рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХрднреА-рдХрднреА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддреЗ рд╕рдордпред рдЖрдо рддреМрд░ рдкрд░, рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
run_one(), poll()
рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдк
run_one(), poll()
, рдпрд╛
poll_one()
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдЙрдкрдпреЛрдЧ service.post()
рдпрд╛ service.dispatch()
редрдЕрдВрдд рдореЗрдВ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХреА рдкреВрд░реА рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди рд╡реИрдз рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдФрд░ рдмрдлрд░ (рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреА рдХрдХреНрд╖рд╛ connection
рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП enabled_shared_from_this
, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рднреАрддрд░ рд╕рдорд╛рд╣рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╣рд░ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЗрд╕ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд╕рд╛рдЭрд╛ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВредрдЕрдЧрд▓рд╛ рдЕрдзреНрдпрд╛рдп рдмрд╣реБрдд рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рд╣реЛрдЧрд╛; рдХреНрд▓рд╛рдЗрдВрдЯ / рд╕рд░реНрд╡рд░ рдЧреВрдВрдЬ рдЬреИрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛрдбрд┐рдВрдЧредрдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж, рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ!