"Boost.Asio C ++ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред" рдЕрдзреНрдпрд╛рдп 6: - рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рдЬреЙрди рдЯреЛрд░рдЬреЛ рдХреА рдкреБрд╕реНрддрдХ Boost.Asio C ++ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред

рд╕рд╛рдордЧреНрд░реА:


рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд╣рдо Boost.Asio рдХреА рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЬрд╛рдиреА-рдорд╛рдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдПрд╕рдЯреАрдбреА рд╕реНрдЯреНрд░реАрдо рдФрд░ рд╕реНрдЯреНрд░реАрдордмреЙрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ Boost.Asio - co-routines рдХреЗ рдмрдЬрд╛рдп рдПрдХ рджреЗрд░ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди (рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдерд╛)ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрджреНрднреБрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред



std рдзрд╛рд░рд╛рдПрдБ рдФрд░ std рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░



рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд▓рд┐рдЦреА рдмрд╛рддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрд╕рдЯреАрдПрд▓ рдзрд╛рд░рд╛рдУрдВ рдФрд░ рдПрд╕рдЯреАрдПрд▓ рд╕реНрдЯреНрд░реАрдордмреНрдпреВрдл рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
Boost.Asio рдореЗрдВ I / O рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдлрд╝рд░реНрд╕ рд╣реИрдВ:

рдкреБрд╕реНрддрдХ рдХреЗ рджреМрд░рд╛рди, рдЖрдкрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рджреЗрдЦрд╛:

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; // ... initialize p out << p << std::endl; write(sock, buf); 

рджреВрд╕рд░рд╛ рдкрдХреНрд╖ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ:

 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; // dumps all content to the console 

рдЗрд╕реА рддрд░рд╣, рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 std::string to_string(streambuf &buf) { std::ostringstream out; out << &buf; return out.str(); } 


рдХреНрд▓рд╛рд╕ рд╕реНрдЯреНрд░реАрдордл


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, streambuf std::streambuf. рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ std::streambuf. Std :: streambuf рдХреА рддрд░рд╣ рдЗрд╕рдореЗрдВ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕рдХреА рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ:

рдкрд┐рдЫрд▓реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдмрд╛рдХреА рдХреЛ рд╕рдордЭрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ streambuf рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреЗрдЬреЗрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 read_until(sock, buf, "\n"); // reads into buf write(sock, buf); // writes from buf 

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

 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 рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ рдЬреЛ рд╕реНрдЯреНрд░реАрдордмреЙрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рд╕реНрд╡рд░ рддрдХ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 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 рдореЗрдВ, рджреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдо рдЕрдзреНрдпрд╛рдп 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 рдФрд░ рд╕рд╛рде рд╣реА рдХреБрдЫ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдЬреИрд╕реЗ рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди: рд▓рд┐рдВрдХ

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж, рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ!

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


All Articles