рд╣рд╛рдп рд╣рдмрд░рд▓реБрдбреА!
рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдбрд╝рд╛рдИ рд╕реЗ рдиреНрдпрд╛рдп рди рдХрд░реЗрдВред рдореИрдВ рдЬреЙрди рдЯреЛрд░рдЬреЛ рдХреА рдкреБрд╕реНрддрдХ Boost.Asio C ++ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛
рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдпрд╣рд╛рдВ рдЗрд╕рдХреА рдПрдХ
рдХрдбрд╝реА рд╣реИред
рд╕рд╛рдордЧреНрд░реА:
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ Boost.Asio рдХреНрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рд╛рде рд╣реА рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рднреАред рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ Boost.Asio рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдЖрдк рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдиреЗрдВрдЧреЗ, рдЬреЛ Boost.Asio -
io_service
рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
Boost.Asio рдХреНрдпрд╛ рд╣реИ?
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, Boost.Asio, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдирд┐рдореНрди-рд╕реНрддрд░реАрдп I / O рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИрдВред
рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд▓реЗрдХрд┐рди Boost.Asio рдиреЗ рдЙрди рд╕рднреА рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ; 2005 рдореЗрдВ рдмреВрд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рддрдм рд╕реЗ рдЗрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмреВрд╕реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ:
- рд░реЗрдореЛрдмреЛ , рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЖрдИрдкреАрдПрди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
- libtorrent , рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдмрд┐рдЯрдЯреЛрд░реЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ
- рдкреЛрдХрд░, рд▓реИрди рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдкреЛрдХрд░ рдЧреЗрдо рд╣реИ
Boost.Asio рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдореВрд░реНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рди рдХреЗрд╡рд▓ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реАрд░рд┐рдпрд▓ COM рдкреЛрд░реНрдЯреНрд╕, рдлрд╛рдЗрд▓реНрд╕, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЗрдирдкреБрдЯ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
read(stream, buffer [, extra options]) async_read(stream, buffer [, extra options], handler) write(stream, buffer [, extra options]) async_write(stream, buffer [, extra options], handler)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рди рдХреЗрд╡рд▓ рдПрдХ рд╕реЙрдХреЗрдЯ, рд╣рдо рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рде рдПрдХ рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рддрд░рд╛рдЬреВ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдкрд╛рд░реНрдЯ BSD (рдмрд░реНрдХрд▓реЗ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди) рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЕрдиреБрдпрд╛рдпреА рдерд╛ред рдЯреАрд╕реАрдкреА (рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХрдВрдЯреНрд░реЛрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рд╕реЙрдХреЗрдЯреНрд╕, рдпреВрдбреАрдкреА (рдпреВрдЬрд░ рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рд╕реЙрдХреЗрдЯреНрд╕, рдЖрдИрдПрдорд╕реАрдкреА (рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдореИрд╕реЗрдЬ рдкреНрд░реЛрдЯреЛрдХреЙрд▓) рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ред
рдХрд╣рд╛рдиреА
2003 рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рджрд┐рд╕рдВрдмрд░ 2005 рдореЗрдВ Boost.Asio рдХреЛ Boost 1.35 рдкрд░ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореВрд▓ рд▓реЗрдЦрдХ рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд░ рдПрдоред рдХреЛрд╣рд▓реЛрдлрд╝ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ chris@kohlhoff.com рдкрд░ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдФрд░ рд╕рдВрдХрд▓рдХ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рд╡рд┐рдЬреБрдЕрд▓ C ++ 7.1 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП 32-рдмрд┐рдЯ рдФрд░ 64-рдмрд┐рдЯ рд╡рд┐рдВрдбреЛрдЬ
- Windows рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ MinGW
- Cygwin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Windows (рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐
__USE_232_SOCKETS
рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ) - рд▓рд┐рдирдХреНрд╕ 2.4 рдФрд░ 2.6 рдХрд░реНрдиреЗрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд g ++ 3.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ
- рдЬреА ++ 3.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реЛрд▓рд╛рд░рд┐рд╕
- рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ 10.4+ рдЬреА ++ 3.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
рдпрд╣ AIX 5.3, HP-UX 11i v3, QNX Neutrino 6.3, Solaris рдЬреИрд╕реЗ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, Sun Studio 11+, True64 v5.1, Windows, Borland C ++ 5.9.2+ (
www рдХреЗ рдкрд░рд╛рдорд░реНрд╢ рд╕реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
.boost.org рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП)ред
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
Boost.Asio рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
- Boost.System: рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмреВрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (http://www.boost.org/doc/libs/1_51_0/doc/html/boost_system/index.html) рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ
- Boost.Regex: рдпрджрд┐ рдЖрдк
read_until()
рдпрд╛ read_until()
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд╡рд┐рдХрд▓реНрдк) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ boost::regex
рдкреИрд░рд╛рдореАрдЯрд░ - Boost.DateTime: рдпрджрд┐ рдЖрдк Boost.Asio рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд╡рд┐рдХрд▓реНрдк) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- OpenSSL: рдпрджрд┐ рдЖрдк Boost.Asio рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП SSL рд╕рдорд░реНрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд╡рд┐рдХрд▓реНрдк) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
Buost.Asio рдмрд┐рд▓реНрдб
Boost.Asio рдПрдХ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╣реЗрдбрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдВрдХрд▓рдХ рдФрд░ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ Boost.Asio рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рди рд╕рдордп рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдХреЗрд╡рд▓ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ
#include <boost/asio/impl/src.hpp>
(рдпрджрд┐ рдЖрдк SSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ #include <boost/asio/ssl/impl/src.hpp>
) - рдЕрдкрдиреЗ рд╕рднреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ
#define BOOST_ASIO_SEPARATE_COMPILATION
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Boost.Asio Boost.System рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ Boost.Regex рдкрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрдврд╝рд╛рд╡рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
bjam тАУwith-system тАУwith-regex stage
рдпрджрд┐ рдЖрдк рднреА рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
bjam тАУwith-system тАУwith-thread тАУwith-date_time тАУwith-regex тАУwithserialization stage
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореИрдХреНрд░реЛрдЬрд╝
рдпрджрд┐ рд╕реЗрдЯ рд╣реЛ рддреЛ
BOOST_ASIO_DISABLE_THREADS
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рдпрд╣ Boost.Asio рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рд╕рдкреЛрд░реНрдЯ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдмреВрд╕реНрдЯ рдХреЛ рд╕реНрдЯреНрд░реАрдо рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдмреЗрд╣рдж рдЕрд▓рдЧ рд╣реИред рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рдЖрдк рд╕рднреА рдСрдкрд░реЗрд╢рди рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕реЙрдХреЗрдЯ рдПрд╕ рд╕реЗ рдкрдврд╝рдирд╛ (рдЕрдиреБрд░реЛрдз), рдФрд░ рдлрд┐рд░ рд╕реЙрдХреЗрдЯ рдореЗрдВ рд▓рд┐рдЦрдирд╛ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛)ред рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдЕрд╡рд░реБрджреНрдз рд╣реИред рдЪреВрдВрдХрд┐ рдСрдкрд░реЗрд╢рди рдЕрд╡рд░реБрджреНрдз рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рд╕реЙрдХреЗрдЯ рдореЗрдВ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣реЗ рд╣реИрдВ рддреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реЙрдХреЗрдЯреНрд╕ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ / рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдорддреМрд░ рдкрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╣реЛрддреЗ рд╣реИрдВред
рджреВрд╕рд░реА рдУрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо, рдИрд╡реЗрдВрдЯ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЖрдк рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрдм рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛; рдЖрдк рдПрдХ
callback
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдХреНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рдЕрдиреБрднрд╡ рд╣реИ, рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдХрд┐рдпрд╛ рдХреЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдпрд╣ рджреВрд╕рд░реА рдкреНрд░рдХреГрддрд┐ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдг (рдЕрдзрд┐рдорд╛рдирддрдГ рд╢реБрд░реБрдЖрдд рдореЗрдВ) рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдХрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдХреЛ рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реЛрдЧрд╛; рди рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ, рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдмрд╣реБрдд рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ (рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдиреЗрдЯрд╡рд░реНрдХ рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддреЗ рд╣реИрдВ)ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдпрд╛ рддреЛ рдЕрд╡рд░реБрджреНрдз рдХреЙрд▓ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЖрдорддреМрд░ рдкрд░ рдЖрд╕рд╛рди рд╣реИ) рдпрд╛ рдХреБрдЫ рдереНрд░реЗрдбреНрд╕ рдФрд░ рдИрд╡реЗрдВрдЯ (рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЖрдорддреМрд░ рдкрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ)ред
рдпрд╣рд╛рдБ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
using boost::asio; io_service service; ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001); ip::tcp::socket sock(service); sock.connect(ep);
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Boost.Asio рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ I / O рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП io_service рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░
io_service
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╡рд╣ рдкрддрд╛ рдФрд░ рдкреЛрд░реНрдЯ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВред рд╕реЙрдХреЗрдЯ рдХреЛ рдЕрдкрдиреЗ рдкрддреЗ рдФрд░ рдкреЛрд░реНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
рдлрд┐рд░ рд╕реЗ, рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрдм рдЖрдк рдкреЛрд░реНрдЯ рдХреЛ рд╕реБрдирдиреЗ рдФрд░ рдПрдХ рд╕реНрд╡реАрдХрд░реНрддрд╛ (рд░рд┐рд╕реАрд╡рд░) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИред
рдЕрдЧрд▓реЗ рд▓реВрдк рдореЗрдВ, рдЖрдк рдПрдХ рдбрдореА рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рдереНрд░реЗрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ред
рд╕реНрдЯреНрд░реАрдо рдореЗрдВ,
client_session
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
client_session
рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реБрдирддреЗ рд╣реИрдВ, рдЙрдирдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░реЗрдВрдЧреЗ:
using boost::asio; io_service service; ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 2001); ip::tcp::socket sock(service); sock.async_connect(ep, connect_handler); service.run(); void connect_handler(const boost::system::error_code & ec) {
рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕реЙрдХреЗрдЯ рдХрд╣рд╛рдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рдФрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░, рдЬреИрд╕реЗ рд╣реА рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдПрдбреНрд░реЗрд╕ рдФрд░ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╣ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛ рд╣реИ), рдЬреЛ рдХрд┐
connect_handler
рдХрд╣рд▓рд╛рддрд╛ рд╣реИред
connect_handler
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
connect_handler
рддреНрд░реБрдЯрд┐ рдХреЛрдб (
connect_handler
рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ, рддреЛ рдЖрдк рд╕рд░реНрд╡рд░ рдкрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
service.run()
рд▓реВрдк рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдзреВрд░реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рд╣реИ,
async_connect
рд╕реЙрдХреЗрдЯред рдЙрд╕рдХреЗ рдмрд╛рдж,
service.run()
рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдЕрдиреБрдЧрд╛рдореА рд╣реИрдВрдбрд▓рд░ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдПрдХ рд╕рд░рд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ рд╣реИ:
using boost::asio; typedef boost::shared_ptr<ip::tcp::socket> socket_ptr; io_service service; ip::tcp::endpoint ep( ip::tcp::v4(), 2001));
рдкрд┐рдЫрд▓реЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ, рдкрд╣рд▓реЗ, рдЖрдк рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдкреЛрд░реНрдЯ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдПрдХ рдЧреНрд░рд╛рд╣рдХ - рдЧреНрд░рд╛рд╣рдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡реАрдХрд╛рд░рдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ, рд╕рд╛рде рд╣реА рдПрдХ рдбрдореА рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
рдЕрдВрдд рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ
service.run()
рдЪрд▓рд╛рдПрдВ
service.run()
рд▓реВрдкред рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ
handle_accept
(
async_accept
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╣реИрдВрдбрд▓рд░)ред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рдирдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ
start_accept()
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рдорд╛рди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ "рдЧреНрд░рд╛рд╣рдХ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ", рдЬрд┐рд╕рд╕реЗ
service.run()
рдЪрдХреНрд░ рд╡реНрдпрд╕реНрдд рд░рд╣рддрд╛ рд╣реИред
рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рдЕрдкрд╡рд╛рдж
Boost.Asio рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рдж рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдб рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рднреА рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рднрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ
boost::system::system_error
рддреНрд░реБрдЯрд┐ред
using boost::asio; ip::tcp::endpoint ep; ip::tcp::socket sock(service); sock.connect(ep);
рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдореЗрдВ,
sock.connect(ep)
рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ рдФрд░
sock.connect(ep, err)
рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
try { sock.connect(ep); } catch(boost::system::system_error e) { std::cout << e.code() << std::endl; }
рдирд┐рдореНрди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ:
boost::system::error_code err; sock.connect(ep, err); if ( err) std::cout << err << std::endl;
рдпрджрд┐ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╕рднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рджреЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдХрднреА рдирд╣реАрдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдФрд░ рдЙрд╕реЗ рдХреМрди рдкрдХрдбрд╝реЗрдЧрд╛?
рдЕрдкрдиреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ, рдЖрдк рдЕрдкрд╡рд╛рдж рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдб (рдЬреЛ рднреА рдЖрдк рдЕрдзрд┐рдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрдиреНрд╣реЗрдВ рдорд┐рд▓рд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдпрд╛ рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЬрдм рдЖрдк рдЧрд▓рддреА рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рднреВрд▓ рдЬрд╛рдПрдВ)ред рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЬрдЯрд┐рд▓ рд╣реИ (рд╕реЙрдХреЗрдЯ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИрдВ рдФрд░ рдПрдХ
try {} catch
рдмреНрд▓реЙрдХ рдореЗрдВ рд░реАрдб рдПрдВрдб рд░рд╛рдЗрдЯ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
void client_session(socket_ptr sock) { try { ... } catch ( boost::system::system_error e) {
рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХрдм рдмрдВрдж рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
char data[512]; boost::system::error_code error; size_t length = sock.read_some(buffer(data), error); if (error == error::eof) return;
рд╕рднреА Boost.Asio рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ
boost::asio::error
рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ
boost::asio::error
рдирд╛рдо рд╕реНрдерд╛рди (рдпрджрд┐ рдЖрдк рдЧрд▓рддреА рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдЦреЛрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП
boost/asio/error.hpp
рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
Boost.Asio рдореЗрдВ рдзрд╛рд░рд╛рдПрдБ
рдЬрдм Boost.Asio рдореЗрдВ рдзрд╛рд░рд╛рдПрдБ рдЖрддреА рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
io_service
: io_service
рд╡рд░реНрдЧ рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдПрдХрд╛рдзрд┐рдХ рдереНрд░реЗрдб io_service::run()
рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЖрдк рд╢рд╛рдпрдж рдПрдХ рд╣реА рдзрд╛рдЧреЗ рд╕реЗ io_service::run()
рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдЕрд╡рд░реБрджреНрдз рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдХрдИ рдереНрд░реЗрдбреНрд╕ рд╕реЗ io_service::run()
рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ рдЬреЛ io_service::run()
рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рд╕рднреА рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереНрд░реЗрдб рдХреЗ рдореАрд▓ рдХреЗ рдкрддреНрдерд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕реЗ io_service::run()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕рдХрд╛ рдпрд╣ рднреА рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ io_service::run()
рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рджрд┐рдП рдЧрдП рдзрд╛рдЧреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рднреА рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редsocket
: socket
рдХрдХреНрд╖рд╛рдПрдВ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕реЙрдХреЗрдЯ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрдврд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ, Boost.Asio рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)редutility
: utility
рд╡рд░реНрдЧ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рдереНрд░реЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд╡реЗ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдереЛрдбрд╝реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВред
Boost.Asio рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЖрдкрдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдЗрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЖрдкрдХрд╛ рдХреЛрдб рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдЙрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рд╕реЗ
io_service::run()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреЗрдЯрд╡рд░реНрдХ рд╣реА рдирд╣реАрдВ
Boost.Asio рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп I / O рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
Boost.Asio рдЖрдкрдХреЛ
SIGTERM
(рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛),
SIGINT
(рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рд╡реНрдпрд╡рдзрд╛рди), SIGSEGV (рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди) рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЖрдк
signal_set
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
void signal_handler(const boost::system::error_code & err, int signal) {
рдпрджрд┐
SIGINT
рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк
signal_handler
рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
Boost.Asio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рдВрдбреЛрдЬ рдкрд░ COM7 рдкреЛрд░реНрдЯ рдирд╛рдо рдпрд╛ POSIX рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ / dev / ttyS0:
io_service service; serial_port sp(service, "COM7");
рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдкреЛрд░реНрдЯ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд░реЗрдЯ, рд╕рдорддрд╛, рд╕реНрдЯреЙрдк рдмрд┐рдЯреНрд╕, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
serial_port::baud_rate rate(9600); sp.set_option(rate);
рдпрджрд┐ рдкреЛрд░реНрдЯ рдЦреБрд▓рд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ / рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐: рд╢реБрд▓реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
read()
,
async_read()
,
write()
,
async_write()
, рдЬреИрд╕рд╛ рдХрд┐ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг:
char data[512]; read(sp, buffer(data, 512));
Boost.Asio рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ
read()
,
asyn_read()
рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рдирд┐рд╢реБрд▓реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
HANDLE h = ::OpenFile(...); windows::stream_handle sh(service, h); char data[512]; read(h, buffer(data, 512));
рдЖрдк POSIX рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЬреИрд╕реЗ рдкрд╛рдЗрдк, рд╕реНрдЯреИрдВрдбрд░реНрдб I / O, рд╡рд┐рднрд┐рдиреНрди рдбрд┐рд╡рд╛рдЗрд╕ (рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рдлрд╛рдЗрд▓ рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
posix::stream_descriptor sd_in(service, ::dup(STDIN_FILENO)); char data[512]; read(sd_in, buffer(data, 512));
рдЯрд╛рдЗрдорд░
рдХреБрдЫ I / O рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдХреА рдХрдореА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЪреВрдВрдХрд┐ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рдорддрд▓рдм рд╕рдордп рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рд╕рд╛рдереА рд╕реЗ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рдЖрдкрдХреЛ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП:
bool read = false; void deadline_handler(const boost::system::error_code &) { std::cout << (read ? "read successfully" : "read failed") << std::endl; } void read_handler(const boost::system::error_code &) { read = true; } ip::tcp::socket sock(service); тАж read = false; char data[512]; sock.async_read_some(buffer(data, 512)); deadline_timer t(service, boost::posix_time::milliseconds(100)); t.async_wait(&deadline_handler); service.run();
рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, рдпрджрд┐ рд╣рдо рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдкрдврд╝рд╛ рдЬрд╛рдирд╛
true
, рддреЛ рд╣рдорд╛рд░рд╛ рд╕рд╛рдереА рд╕рдордп рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣реБрдБрдЪ рдЧрдпрд╛ред рдЕрдиреНрдпрдерд╛, рдЬрдм
deadline_handler
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА
read
рдХреЛ
false
рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
false
, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╕рдордп рдХреЗ рдЕрдВрдд рддрдХ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Boost.Asio рдЖрдкрдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
sleep
рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреЗ рд╣реИрдВред рд▓рд╛рдЗрди
boost::this_thread::sleep(500);
рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ:
deadline_timer t(service, boost::posix_time::milliseconds(500)); t.wait();
рдХрдХреНрд╖рд╛ io_service
рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ Boost.Asio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб io_service рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
io_service
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рд╣реИ, рдпрд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рджрд┐рдЦрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рдЖрдк рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ
io_service
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди, рджреЛ рдЬреБрдбрд╝реЗ рд╕реЙрдХреЗрдЯ рдФрд░ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЯрд╛рдЗрдорд░ рд╣реИ:
- рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рдФрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдзрд╛рдЧрд╛:
io_service service_;
- рдПрдХ
io_service
рдЙрджрд╛рд╣рд░рдг рдФрд░ рдХрдИ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд╕реВрддреНрд░:
io_service service_; ip::tcp::socket sock1(service_); ip::tcp::socket sock2(service_); sock1.async_connect( ep, connect_handler); sock2.async_connect( ep, connect_handler); deadline_timer t(service_, boost::posix_time::seconds(5)); t.async_wait(timeout_handler); for ( int i = 0; i < 5; ++i) boost::thread( run_service); void run_service() { service_.run(); }
io_service
рдФрд░ рдХрдИ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд╕реВрддреНрд░:
io_service service_[2]; ip::tcp::socket sock1(service_[0]); ip::tcp::socket sock2(service_[1]); sock1.async_connect( ep, connect_handler); sock2.async_connect( ep, connect_handler); deadline_timer t(service_[0], boost::posix_time::seconds(5)); t.async_wait(timeout_handler); for ( int i = 0; i < 2; ++i) boost::thread( boost::bind(run_service, i)); void run_service(int idx) { service_[idx].run(); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдереНрд░реЗрдб рдореЗрдВ рдХрдИ
io_service
рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ:
for ( int i = 0; i < 2; ++i) service_[i].run();
рдХреЛрдб рдХреЗ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
service_[1].run()
рдХреЛ рдкрд╣рд▓реЗ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп
service_[0].run()
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ
service_[1]
рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред
рдкрд┐рдЫрд▓реЗ рд╕рднреА рддреАрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рддреАрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ред рдорддрднреЗрджреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐, рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдСрдкрд░реЗрд╢рди 1 рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдСрдкрд░реЗрд╢рди 2 рдЙрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдпрд╣ рднреА рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рднреА рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдСрдкрд░реЗрд╢рди 2 рдкрд╣рд▓реЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдВрдЧреЗред
рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рддреАрди рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред
рдЬреИрд╕реЗ рд╣реА рдСрдкрд░реЗрд╢рди 2 рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рддреБрд░рдВрдд рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ (рдЬрдмрдХрд┐ рдкрд╣рд▓рд╛ рдзрд╛рдЧрд╛ рд╡реНрдпрд╕реНрдд рд╣реИ, рдкрд╣рд▓реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ)редрдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдСрдкрд░реЗрд╢рди 1 connect
k sock1
рдФрд░ рдСрдкрд░реЗрд╢рди 2 connect
k рд╣реИ sock2
, рддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рдкрд╣рд▓рд╛ рдереНрд░реЗрдб рд╣реИрдВрдбрд▓рд░ рдХреЗ connect
рд▓рд┐рдП рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ sock1
, рдФрд░ рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ connect
рд▓рд┐рдП рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛ sock2
ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реЗ рдЕрдЧрд░ sock1
рдПрдХ рдСрдкрд░реЗрд╢рди 1 рдФрд░ рд╕рдордп рд╕рдорд╛рдкреНрддрд┐ deadline_timer t
рдЖрдкрд░реЗрд╢рди 2 рд╣реИ, рдкрд╣рд▓реА рдзрд╛рд░рд╛ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░реЗрдВрдЧреЗ connect
рдХреА sock1
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИрдВрдбрд▓рд░ deadline_timer t
рдХреЛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редconnect
рд╕реЗ sock1
(рдпрд╣ рдПрдХ рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛), рдкрд╣рд▓реЗ рдереНрд░реЗрдб рдореЗрдВ рд╣реИрдВрдбрд▓рд░ sock1
рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИрдВрдбрд▓рд░ рджреЛрдиреЛрдВ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ t
редрдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:- рдмреБрдирд┐рдпрд╛рджреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ 1ред рдпрджрд┐ рдХрдИ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓реЗрдВрдЧреЗред рдЕрдЧрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЦрддреНрдо рд╣реЛрдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- 2 . , . , . , -.
- 3 . , 2 . , (). , - (,
io_service::run()
) select/epoll
; , / . , , ( 1000 ). select/epoll
.
рдпрджрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрднреА рднреА рд╕реНрдерд┐рддрд┐ 3 рдкрд░ рдЬрд╛рдПрдЧрд╛, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреЛрдб рдХрд╛ рдХреЛрдб (рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб io_service::run()
) рд╢реЗрд╖ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХреЗредрдЕрдВрдд рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ .run()
рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: io_service service_; tcp::socket sock(service_); sock.async_connect( ep, connect_handler); service_.run();
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕реЗ рд╣реА рд╕реЙрдХреЗрдЯ рдиреЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ connect_handler
рдФрд░ service.run()
рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдпрджрд┐ рдЖрдк service.run()
рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рддреЛ рдЖрдкрдХреЛ рдЙрд╕реЗ рдФрд░ рдХрд╛рдо рджреЗрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдПрдХ рддрд░реАрдХрд╛ рдПрдХ connect_handler
рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдЪрд▓рд╛рдХрд░ рд▓реЛрдб рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рд╣реИ редрджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХреБрдЫ рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реИ: typedef boost::shared_ptr<io_service::work> work_ptr; work_ptr dummy_work(new io_service::work(service_));
рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдПрдХ рд╕реНрдерд┐рд░ рдиреМрдХрд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ service_.run()
рдЬрдм рддрдХ рдЖрдк рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ useservice_.stop()
рдпрд╛ dummy_work.reset(0); // destroy dummy_work
редрд╕рд╛рд░рд╛рдВрд╢ред
Boost.Asio рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ; рдХрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЪрд╛рд▓реВ / рдмрдВрдж рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПредBoost.Asio рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпреЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реИредрдпрджрд┐ рдЖрдкрдиреЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪреБрдирд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдбреЛрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛрдбреЛрдВ рддрдХ рд╕рдВрдХреНрд░рдордг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рддреНрд░реБрдЯрд┐ рдХреЛрдб) рдореЗрдВ рдПрдХ рдФрд░ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредBoost.Asio рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рдмрдирд╛рддреА рд╣реИрдВ, рдЬреИрд╕реЗ рд╕рд┐рдЧреНрдирд▓, рдЯрд╛рдЗрдорд░ рдФрд░ рдЗрд╕реА рддрд░рд╣редрдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо Boost.Asio рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЧреБрд░ рд╕реАрдЦреЗрдВрдЧреЗредрдЦреИрд░, рдпрд╣ рд╕рдм рдЖрдЬ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛, рддреЛ рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВредрд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!