рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рдЬреЙрди рдЯреЛрд░рдЬреЛ рдХреА рдкреБрд╕реНрддрдХ Boost.Asio C ++ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред
рд╕рд╛рдордЧреНрд░реА:
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд╣рдо Boost.Asio рдХреА рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЬрд╛рдиреА-рдорд╛рдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдПрд╕рдЯреАрдбреА рд╕реНрдЯреНрд░реАрдо рдФрд░ рд╕реНрдЯреНрд░реАрдордмреЙрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ Boost.Asio - co-routines рдХреЗ рдмрдЬрд╛рдп рдПрдХ рджреЗрд░ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди (рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдерд╛)ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрджреНрднреБрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
std рдзрд╛рд░рд╛рдПрдБ рдФрд░ std рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд▓рд┐рдЦреА рдмрд╛рддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрд╕рдЯреАрдПрд▓ рдзрд╛рд░рд╛рдУрдВ рдФрд░ рдПрд╕рдЯреАрдПрд▓ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдл рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
Boost.Asio рдореЗрдВ I / O рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдлрд╝рд░реНрд╕ рд╣реИрдВ:
- рдмрдврд╝рд╛рд╡рд╛ :: asio :: рдмрдлрд░ ()
- рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ :: asio :: streambuf
рдкреБрд╕реНрддрдХ рдХреЗ рджреМрд░рд╛рди, рдЖрдкрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рджреЗрдЦрд╛:
size_t read_complete(boost::system::error_code, size_t bytes){ ... } char buff[1024]; read(sock, buffer(buff), read_complete); write(sock, buffer("echo\n"));
рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
streambuf
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
streambuf buf; read(sock, buf);
рдпрд╣ рд░реАрдбрд┐рдВрдЧ рддрдм рддрдХ
streambuf
рдЬрдм рддрдХ рдХрд┐
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ
streambuf
, рдФрд░ рдЪреВрдВрдХрд┐ рд╕реНрдЯреНрд░реАрдордмреЙрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ, рд░реАрдбрд┐рдВрдЧ рддрдм рддрдХ рдЬрд╛рдПрдЧреА рдЬрдм рддрдХ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред рдкрд┐рдЫрд▓реЗ рд╡рд░реНрдг рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк
read_until
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
streambuf buf; read_until(sock, buf, "\n");
рдпрд╣рд╛рдВ, рд░реАрдбрд┐рдВрдЧ '\ n' рд╡рд░реНрдг рддрдХ рдЬрд╛рдПрдЧреА, рдлрд┐рд░ рдЬреЛ рдкрдврд╝рд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕реЗ рдмрдлрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд░реАрдб рдлрдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ред
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
streambuf
рдЖрдк рдирд┐рдореНрди рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░реЗрдВрдЧреЗ:
streambuf buf; std::ostream out(&buf); out << "echo" << std::endl; write(sock, buf);
рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдПрд╕рдЯреАрдПрд▓ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рд╕реНрдЯреНрд░реАрдордмреЙрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦреЗрдВ, рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕реЗ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдмрдлрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП
write
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
Boost.Asio рдФрд░ STL рд╕реНрдЯреНрд░реАрдо
C Boost.Asio рдиреЗ STL рд╕реНрдЯреНрд░реАрдо рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди рдХрд╛рдо рдХрд┐рдпрд╛ред рдЕрд░реНрдерд╛рддреН, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдПрд╕рдЯреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрд╡рд░рд▓реЛрдб рдСрдкрд░реЗрдЯрд░реЛрдВ >> рдФрд░ << рдХреЗ рд╕рд╛рде рдХрдИ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╕реЙрдХреЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдкрд╛рд░реНрдХ рдореЗрдВ рдЯрд╣рд▓рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рдЖрдПрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИрдВ:
struct person { std::string first_name, last_name; int age; }; std::ostream& operator<<(std::ostream & out, const person & p) { return out << p.first_name << " " << p.last_name << " " << p.age; } std::istream& operator>>(std::istream & in, person & p) { return in >> p.first_name >> p.last_name >> p.age; }
рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдорд╛рдирд╡ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
streambuf buf; std::ostream out(&buf); person p;
рджреВрд╕рд░рд╛ рдкрдХреНрд╖ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ:
read_until(sock, buf, "\n"); std::istream in(&buf); person p; in >> p;
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд
std::ostream
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдкрдХреНрд╖
std::ostream
рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП
std::ostream
рдпрд╛
std::istream
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП
std::istream
рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд▓реЗрдЦрди рдХреЛрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛:
- рдЬрдм рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдВрдд рдореЗрдВ, рдЖрдк рдмрдлрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдпрджрд┐ рдпрд╣ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред << рд╕рдВрдЪрд╛рд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
- рд╕рдВрджреЗрд╢ рдкрдврд╝рддреЗ рд╕рдордп рджреВрд╕рд░реА рдУрд░ рднреА рдпрд╣реА рдмрд╛рдд рд╣реЛрддреА рд╣реИ; рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рд╕рдордп рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкрдврд╝реЗрдВ, рдФрд░ рдпрджрд┐ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдкрдврд╝рддреЗ рд╕рдордп >> рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдХрдВрд╕реЛрд▓ рдореЗрдВ
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЯреНрд░рд┐рдХ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
streambuf buf; ... std::cout << &buf << std::endl;
рдЗрд╕реА рддрд░рд╣, рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
std::string to_string(streambuf &buf) { std::ostringstream out; out << &buf; return out.str(); }
рдХреНрд▓рд╛рд╕ рд╕реНрдЯреНрд░реАрдордл
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛,
streambuf
std::streambuf.
рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
std::streambuf.
Std :: streambuf рдХреА рддрд░рд╣ рдЗрд╕рдореЗрдВ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕рдХреА рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ:
streambuf ([max_size,] [allocator])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдлрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрддрдо рдмрдлрд░ рдЖрдХрд╛рд░ рдФрд░ рдЖрд╡рдВрдЯрди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдореГрддрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд / рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редprepare(n)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди n
рд╡рд░реНрдгреЛрдВ рдХреЗ рдирд┐рд░рдВрддрд░ рдХреНрд░рдо рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЙрдк-рдмрдлрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ Boost.Asio рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдлрд╝ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ / рд▓рд┐рдЦрдиреЗ рдФрд░ рди рдХреЗрд╡рд▓ streambuf
рд╣реИредdata()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрдгреЛрдВ рдХреЗ рдирд┐рд░рдВрддрд░ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реЗ рдмрдлрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ Boost.Asio рд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрди рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдлрд╝ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВредconsume(n)
: рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо (рдПрдХ рд░реАрдб рдСрдкрд░реЗрд╢рди рд╕реЗ) рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредcommit(n)
: рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрдХреНрд░рдо (рд░рд╛рдЗрдЯ рдСрдкрд░реЗрд╢рди) рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо (рд░реАрдб рдСрдкрд░реЗрд╢рди рдореЗрдВ) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИредsize()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдкреВрд░реНрдг streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИредmax_size()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рдХрддрдо рдЙрди рд╡рд░реНрдгреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдмрд╛рдХреА рдХреЛ рд╕рдордЭрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ
streambuf
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреЗрдЬреЗрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
read_until(sock, buf, "\n");
рдпрджрд┐ рдЖрдк рд╕рдВрдкреВрд░реНрдг рдмрдлрд╝рд░ рдХреЛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдмрдлрд╝рд░ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
read_until(sock, buf, '\n'); std::cout << &buf << std::endl;
рдкрд┐рдЫрд▓рд╛ рд╕реНрдирд┐рдкреЗрдЯ рд░реАрд╕реЗрдЯ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдк рд╕реЙрдХреЗрдЯ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдбрдВрдк рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
read(sock, buf.prepare(16), transfer_exactly(16) ); std::cout << &buf << std::endl;
рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреЙрдЗрдВрдЯрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ред рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
read(sock, buf.prepare(16), transfer_exactly(16) ); buf.commit(16); std::cout << &buf << std::endl;
рдЗрд╕реА рддрд░рд╣, рдпрджрд┐ рдЖрдк рдПрдХ
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдЦрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
streambuf buf; std::ostream out(&buf); out << "hi there" << std::endl; write(sock, buf);
рдирд┐рдореНрди рдХреЛрдб рддреАрди рдмрд╛рд░
hi there
рднреЗрдЬреЗрдЧрд╛:
streambuf buf; std::ostream out(&buf); out << "hi there" << std::endl; for ( int i = 0; i < 3; ++i) write(sock, buf.data());
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрдлрд░ рдХрднреА рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд╡рд╣реАрдВ рд░рд╣рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдП, рддреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
streambuf buf; std::ostream out(&buf); out << "hi there" << std::endl; write(sock, buf.data()); buf.consume(9);
рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ
streambuf
рдХреА рдкреВрд░реА рдЖрд╡реГрддреНрддрд┐ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрд╕рдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рднрд▓реЗ рд╣реА рдЖрдк рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдл рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдореИрдВ рдЖрдкрдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдПрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪреЗрдВрдЧреЗред
streambuf
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдп
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪреА Boost.Asio рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░реАрдордмреЙрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
read (sock, buf [, completion_function])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рд╕реЗ streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрдврд╝рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓ рд░реАрдб рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ Boost.Asio рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд╣реИ)ред рдЗрд╕рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: size_t completion(const boost::system::error_code & err, size_t bytes_transfered)
рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдлрд╝рдВрдХреНрд╢рди 0 рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдорддрд▓рдм рдЕрдЧрд░ рд░реАрдб рдСрдкрд░реЗрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ; рдпрджрд┐ рд╡реЗ рдПрдХ рдиреЙрдирдЬрд╝реЗрд░реЛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ read_some
рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдЧрд▓реА рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдмрд╛рдЗрдЯреНрд╕ read_some
редread_at(radom_stream, offset, buf [, completion_function])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕реЙрдХреЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдореЙрдбрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)редread_until(sock, buf, char | string | regex | match_condition)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрдврд╝рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдкреВрд░реА рд╣реЛрддреА рд╣реИред рдпрд╛ рддреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреБрдЫ рд░реЗрдЦрд╛ рдпрд╛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдкрдарди рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдореЗрд▓ match_condition
, рдпрд╛ match_condition
рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред match_condition
function рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: match_conditionis pair<iterator,bool>match(iterator begin, iterator end)
; рдЬрд╣рд╛рдВ рдореБрдЦреНрдп рдкреБрдирд░рд╛рд╡рд░реНрддрдХ buffers_iterator <streambuf::const_buffers_type>
ред рдпрджрд┐ рдХреЛрдИ рдореИрдЪ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬреЛрдбрд╝реА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА ( passed-end-of-match
рд╕реЗрдЯ рдЯреВ true
), рдпрджрд┐ рдХреЛрдИ рдореИрдЪ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реА рдЬреЛрдбрд╝реА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА ( begin
false
рд╕реЗрдЯ)редwrite(sock, buf [, completion_function])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ streambuf
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦрддрд╛ рд╣реИред рд╕рдорд╛рдкреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рдкреНрдд рдХрд┐рдП рдЧрдП read()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ: рдпрд╣ 0 рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИ рдЬрдм рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЕрдЧрд▓реЗ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рд▓рд┐рдЦреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ write_some
рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ write_some
рдЬрд╛рддреА write_some
редwrite_at(random_stream,offset, buf [, completion_function])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░реАрдо рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ рд╕реЙрдХреЗрдЯреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИредasync_read(sock, buf [, competion_function], handler)
: read()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдпрд╣ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбрдмрд▓ред рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: void handler(const boost::system::error_code, size_t bytes)
редasync_read_at(radom_stream, offset, buf [, completion_function] ,handler)
: рдпрд╣ read_at()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбрдмрд▓ рд╣реИредasync_read_until (sock, buf, char | string | regex | match_condition, handler)
: рдпрд╣ read_until()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбрдмрд▓ рд╣реИредasync_write(sock, buf [, completion_function] , handler)
: рдпрд╣ write()
рдХрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбрдмрд▓ рд╣реИ write()
рдлрд╝рдВрдХреНрд╢рдиредasync_write_at(random_stream,offset, buf [, completion_function], handler)
: рдпрд╣ write_at()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбрдмрд▓ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рд╕реНрд╡рд░ рддрдХ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
streambuf buf; bool is_vowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; } size_t read_complete(boost::system::error_code, size_t bytes) { const char * begin = buffer_cast<const char*>( buf.data()); if ( bytes == 0) return 1; while ( bytes > 0) { if ( is_vowel(*begin++)) return 0; else --bytes; } return 1; } ... read(sock, buf, read_complete);
рдпрджрд┐ рдЖрдк, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
read_until(sock, buf, boost::regex("^[aeiou]+") );
рдпрд╛ рдореБрдЭреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рджреЗрдВ рдФрд░ рдЖрдк рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
match_condition
function рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
streambuf buf; bool is_vowel(char c) { return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'; } typedef buffers_iterator<streambuf::const_buffers_type> iterator; std::pair<iterator,bool> match_vowel(iterator b, iterator e) { while ( b != e) { if ( is_vowel(*b++)) return std::make_pair(b, true); } return std::make_pair(e, false); } ... size_t bytes = read_until(sock, buf, match_vowel);
coroutine
2009-2010 рдХреЗ рдЖрд╕рдкрд╛рд╕ Boost.Asio рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рд╡реЗ рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИ, рдЬрд┐рддрдирд╛ рдХрд┐ рдЖрд╡реЗрджрди рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Coroutines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЖрдк рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рд╣реИрдВред
рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк coroutines рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рджреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдХреЗрд╡рд▓
boost/libs/asio/example/http/server4: yield.hpp
рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
boost/libs/asio/example/http/server4: yield.hpp
рдФрд░
coroutine.hpp
ред рдпрд╣рд╛рдБ Boost.Asio рдореЗрдВ, рджреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
coroutine
: рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреА рдпрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреА рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рдЖрдк coroutines рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредreenter(entry)
: рдпрд╣ рдХреЛрд░рдЯрд╛рдЗрди рдмреЙрдбреА рд╣реИред рдПрдХ рдЗрдирдкреБрдЯ рддрд░реНрдХ рдПрдХ рд╕рдмрд░реВрдЯреАрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред- рдЙрдкрдЬ рдХреЛрдб: рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдЕрдзреНрдпрд╛рдп 4 рд╕реЗ рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдПрдХ рд╕рд░рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдЕрдиреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЙрдЧ рдЗрди рд╣реИрдВред
рдореБрдЦреНрдп рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ:
class talk_to_svr : public boost::enable_shared_from_this<talk_to_svr> , public coroutine, boost::noncopyable { ... void step(const error_code & err = error_code(), size_t bytes = 0) { reenter(this) { for (;;) { yield async_write(sock_, write_buffer_, MEM_FN2(step,_1,_2) ); yield async_read_until( sock_, read_buffer_,"\n", MEM_ FN2(step,_1,_2)); yield service.post( MEM_FN(on_answer_from_server)); } } } };
рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдмрджрд▓ рдЧрдИ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдЧрд╛рдпрдм рд╣реЛ рдЧрдП рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐
connect(), on_connect(), on_read(),do_read(), on_write(), do_write()
рдФрд░ рдЗрддрдиреЗ рдкрд░, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди
step()
ред
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░
reenter(this) { for (;;) { }}
рдЕрдВрджрд░ рд╣реИ
reenter(this) { for (;;) { }}
ред рдЖрдк
reenter(this)
рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ
reenter(this)
рдЙрд╕ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдерд╛, рддрд╛рдХрд┐ рд╣рдо рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВред
reenter
рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░
reenter
рдЖрдк рдХрдИ рдЪрд╛рд▓реВ рдХреЙрд▓ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
async_write
рдлрд╝рдВрдХреНрд╢рди
async_write
, рджреВрд╕рд░реА рдмрд╛рд░
async_write
рдлрд╝рдВрдХреНрд╢рди
async_read_until
, рддреАрд╕рд░реА рдмрд╛рд░
service.post
рдлрд╝рдВрдХреНрд╢рди, рдЪреМрдереА рдмрд╛рд░
async_write
рдлрд┐рд░ рд╕реЗ рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рдЖрдкрдХреЛ
for(;;) {}.
рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП
for(;;) {}.
рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рджреЗрдЦреЗрдВ:
void step(const error_code & err = error_code(), size_t bytes = 0) { reenter(this) { yield async_write(sock_, write_buffer_, MEM_FN2(step,_1,_2) ); yield async_read_until( sock_, read_buffer_, "\n",MEM_FN2(step,_1,_2)); yield service.post( MEM_FN(on_answer_from_server)); } }
рдпрджрд┐ рд╣рдордиреЗ рддреАрд╕рд░реА рдмрд╛рд░ рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░
service.post
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЪреМрдереА рдмрд╛рд░, рд╣рдо
service.post
рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдкрд╛рдВрдЪрд╡реАрдВ рдмрд╛рд░ рдФрд░ рд╕рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдмрд╛рдд рд╣реЛрдЧреА:
class talk_to_svr : public boost::enable_shared_from_this<talk_to_svr> , public coroutine, boost::noncopyable { talk_to_svr(const std::string & username) : ... {} void start(ip::tcp::endpoint ep) { sock_.async_connect(ep, MEM_FN2(step,_1,0) ); } static ptr start(ip::tcp::endpoint ep, const std::string & username) { ptr new_(new talk_to_svr(username)); new_->start(ep); return new_; } void step(const error_code & err = error_code(), size_t bytes = 0) { reenter(this) { for (;;) { if ( !started_) { started_ = true; std::ostream out(&write_buf_); out << "login " << username_ << "\n"; } yield async_write(sock_, write_buf_, MEM_FN2(step,_1,_2) ); yield async_read_until( sock_,read_buf_,"\n", MEM_FN2(step,_1,_2)); yield service.post( MEM_FN(on_answer_from_server)); } } } void on_answer_from_server() { std::istream in(&read_buf_); std::string word; in >> word; if ( word == "login") on_login(); else if ( word == "ping") on_ping(); else if ( word == "clients") on_clients(); read_buf_.consume( read_buf_.size()); if (write_buf_.size() > 0) service.post( MEM_FN2(step,error_code(),0)); } ... private: ip::tcp::socket sock_; streambuf read_buf_, write_buf_; bool started_; std::string username_; deadline_timer timer_; };
рдЬрдм рд╣рдо рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ
start()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реА рдмрд╛рд░
step()
рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддрдм рд╣реИ рдЬрдм рд╣рдо рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо
async_write
рдЙрдкрдпреЛрдЧ
async_write
, рдлрд┐рд░
async_write
рдФрд░ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (
on_answer_from_server
)ред
on_answer_from_server
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
on_answer_from_server
рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ; рд╣рдо рдкрд╣рд▓рд╛ рд╢рдмреНрдж рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рд╢реЗрд╖ рд╕рдВрджреЗрд╢ (рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ) рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ:
class talk_to_svr : ... { ... void on_login() { do_ask_clients(); } void on_ping() { std::istream in(&read_buf_); std::string answer; in >> answer; if ( answer == "client_list_changed") do_ask_clients(); else postpone_ping(); } void on_clients() { std::ostringstream clients; clients << &read_buf_; std::cout << username_ << ", new client list:" << clients. str(); postpone_ping(); } void do_ping() { std::ostream out(&write_buf_); out << "ping\n"; service.post( MEM_FN2(step,error_code(),0)); } void postpone_ping() { timer_.expires_from_now(boost::posix_time::millisec(rand() % 7000)); timer_.async_wait( MEM_FN(do_ping)); } void do_ask_clients() { std::ostream out(&write_buf_); out << "ask_clients\n"; } };
рдЙрджрд╛рд╣рд░рдг рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕рдордп рдкрд░ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд╖рдг рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЧреНрд░рд╛рд╣рдХ рд╕реВрдЪреА рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдлрд┐рд░, рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдкрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рд╕рдм рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
int main(int argc, char* argv[]) { ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 8001); talk_to_svr::start(ep, "John"); service.run(); }
рдХреЛрд░рдЖрдЙрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╣рдордиреЗ рдХреЛрдб рдХреЛ 15 рд▓рд╛рдЗрдиреЛрдВ рддрдХ рдХрдо рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдпрд╣ рднреА рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрди рдЧрдпрд╛ред рдпрд╣рд╛рдБ рд╣рдордиреЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХреЙрд░рдЖрдЙрдЯ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЫреБрдЖред рдпрджрд┐ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕
рдкреГрд╖реНрда рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рд░рд╛рдВрд╢
рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХрд┐рддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ Boost.Asio STL рдзрд╛рд░рд╛рдУрдВ рдФрд░ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдл рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдХреЙрд░рдЖрдЙрдЯ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рд╕рдордЭ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо Asio рдмрдирд╛рдо Boost.Asio, рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ, SSL рдФрд░ рд╕рд╛рде рд╣реА рдХреБрдЫ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдЬреИрд╕реЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди:
рд▓рд┐рдВрдХрдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж, рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ!