рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдореИрдВ рдЬреЙрди рдЯреЛрд░рдЬреЛ рдХреА рдкреБрд╕реНрддрдХ Boost.Asio C ++ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рджреВрд╕рд░рд╛ рдЕрдзреНрдпрд╛рдп рдмрдбрд╝рд╛ рдирд┐рдХрд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝реВрдВрдЧрд╛ред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Boost.Asio рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рд╣рдо рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рд╕рд╛рдордЧреНрд░реА:
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо Boost.Asio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрд╕реЗ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреАрдЖрдИ
рдпрд╣ рдЕрдиреБрднрд╛рдЧ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ Boost.Asio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмреВрд╕реНрдЯ.рдЕрд╕рд┐рдпреЛ рдиреЗрдорд╕реНрдкреЗрд╕
Boost.Asio рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ
boost::asio
рдирд╛рдо рд╕реНрдерд╛рди рдпрд╛ рдЙрд╕рдХреЗ рдЙрдк-рд╕реНрдерд╛рди, рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
boost::asio
: рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рдореБрдЦреНрдп рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рдд рд╣реИрдВред рдореБрдЦреНрдп рд╡рд░реНрдЧ io_service
рдФрд░ io_service
рд╣реИрдВред рдпрд╣рд╛рдБ read, read_at, read_until
, рдЙрдирдХреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ read, read_at, read_until
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдЙрдирдХреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ read, read_at, read_until
рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВредboost::asio::ip
: рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рд░рд╣рддрд╛ рд╣реИред рдореБрдЦреНрдп рд╡рд░реНрдЧ address, endpoint, tcp, udp, icmp
async_connect
рд╣реИрдВ, рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдп connect
рдФрд░ async_connect
ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ socket
рдХреЛ boost::asio::ip::tcp::socket
рдХреЗрд╡рд▓ boost::asio::ip::tcp
рдЕрдВрджрд░ typedef
рдЧрдпрд╛ рд╣реИ boost::asio::ip::tcp
classредboost::asio::error
: рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ I / O рд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВboost::asio::ssl
: рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рд╣реИрдВредboost::asio::local
: рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ POSIX- рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВboost::asio::windows
: рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ Windows- рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ
рдЖрдИрдкреА тАЛтАЛрдкрддреЗ
рдЖрдИрдкреА тАЛтАЛрдкрддреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Boost.Asio рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ
ip::address, ip::address_v4
рдФрд░
ip::address_v6
рдкрддрд╛_v6 рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╡реЗ рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ:
ip::address(v4_or_v6_address)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди v4 рдпрд╛ v6 рдкрддреЗ рдХреЛ ip::address
рдкрддреЗ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИредip::address:from_string(str)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди IPv4 рдПрдбреНрд░реЗрд╕ (рдкреАрд░рд┐рдпрдбреНрд╕ рд╕реЗ рдЕрд▓рдЧ) рдпрд╛ IPv6 (рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдлреЙрд░реНрдореЗрдЯ) рд╕реЗ рдПрдХ рдПрдбреНрд░реЗрд╕ рдмрдирд╛рддрд╛ рд╣реИредip::address::to_string()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрдХреВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реВрдк рдореЗрдВ рдкрддрд╛ рджреЗрддрд╛ рд╣реИip::address_v4::broadcast([addr, mask])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ broadcast
рдкрддрд╛ рдмрдирд╛рддрд╛ рд╣реИip::address_v4::any()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкрддрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкрддреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИip::address_v4::loopback(), ip_address_v6::loopback()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрддреЛрдВ рдХрд╛ рдПрдХ рд▓реВрдк рд▓реМрдЯрд╛рддрд╛ рд╣реИ (v4 / v6 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ)ip::host_name()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╣реЛрд╕реНрдЯ рдХрд╛ рдирд╛рдо рджреЗрддрд╛ рд╣реИ
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛
ip::address::from_string
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
ip::address::from_string
:
ip::address addr = ip::address::from_string("127.0.0.1");
рдпрджрд┐ рдЖрдкрдХреЛ рд╣реЛрд╕реНрдЯ рдирд╛рдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдкрдврд╝реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ (рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ)
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдмрдВрджрд░рдЧрд╛рд╣ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реЙрдХреЗрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдкрдирд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
ip::tcp::endpoint, ip::udp::endpoint
, рдФрд░
ip::icmp::endpoint
ред
рдпрджрд┐ рдЖрдк рдкреЛрд░реНрдЯ 80 рдкрд░
localhost
рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 80);
рдЖрдк рддреАрди рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
endpoint()
: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХрднреА-рдХрднреА рдпреВрдбреАрдкреА / рдЖрдИрд╕реАрдПрдордкреА рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИendpoint(protocol, port)
: рдЖрдорддреМрд░ рдкрд░ рдирдП рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИendpoint(addr, port)
: рдПрдбреНрд░реЗрд╕ рдФрд░ рдкреЛрд░реНрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдмрдирд╛рдПрдВ
рдпрд╣рд╛рдБ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
ip::tcp::endpoint ep1; ip::tcp::endpoint ep2(ip::tcp::v4(), 80); ip::tcp::endpoint ep3( ip::address::from_string("127.0.0.1), 80);
рдпрджрд┐ рдЖрдк рд╣реЛрд╕реНрдЯ (рдЖрдИрдкреА рдкрддреЗ рд╕реЗ рдирд╣реАрдВ) рд╕реЗ рдЬреБрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
рдЖрдк tcp рдХреЛ рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЙрдХреЗрдЯ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╡реЗрд░реА рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рдЖрдк рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕реЗ
resolve()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░, рдХрдо рд╕реЗ рдХрдо рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕рдХрд╛ рдкрддрд╛, рдкреЛрд░реНрдЯ рдФрд░ IP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (v4 рдпрд╛ v6) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
std::cout << ep.address().to_string() << ":" << ep.port() << "/" << ep.protocol() << std::endl;
рд╕реЙрдХреЗрдЯ
Boost.Asio рдореЗрдВ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЙрдХреЗрдЯ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
ip::tcp, ip::udp
, рдФрд░
ip::icmp
, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЬрдЯрд┐рд▓ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ
boost/ asio/ip/tcp.hpp
,
boost/asio/ip/udp.hpp
, рдФрд░
boost/asio/ip/icmp.hpp
ред рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ
typedef
рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЫреЛрдЯреЗ рд╡рд░реНрдЧ рд╣реИрдВред
рдЖрдк рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ
ip::tcp, ip::udp, ip::icmp
рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ; рд╡реЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ / рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- ip :: tcp :: рд╕реЙрдХреЗрдЯ, ip :: tcp :: рд╕реНрд╡реАрдХрд░реНрддрд╛, ip :: tcp :: рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ, ip :: tcp :: resolver, ip :: tcp :: iostream
- рдЖрдИрдкреА тАЛтАЛ:: udp :: рд╕реЙрдХреЗрдЯ, рдЖрдИрдкреА :: udp :: рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ, рдЖрдИрдкреА :: udp :: рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░
- ip :: icmp :: рд╕реЙрдХреЗрдЯ, ip :: icmp :: рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ, ip :: icmp :: resolver
socket
рдХреНрд▓рд╛рд╕ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЙрдХреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рд╣рдореЗрд╢рд╛
io_service
рдХреЛ
io_service
рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВ:
io_service service; ip::udp::socket sock(service) sock.set_option(ip::udp::socket::reuse_address(true));
рдкреНрд░рддреНрдпреЗрдХ рд╕реЙрдХреЗрдЯ рдирд╛рдо рдореЗрдВ рдПрдХ
typedef
:
ip::tcp::socket= basic_stream_socket
ip::udp::socket= basic_datagram_socket<ud
p>
ip::icmp::socket= basic_raw_socket
рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдХреЛрдб
рд╕рднреА рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рд╣реИрдВ рдЬреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
sync_func( arg1, arg2 ... argN);
рдЕрдзреНрдпрд╛рдп рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдореЗрдВ, рдЖрдк рдХрдИ рд╕рдордХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рджреЗрдЦреЗрдВрдЧреЗред рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдУрд╡рд░рд▓реЛрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВред
рд╕реЙрдХреЗрдЯ рдХрд╛рд░реНрдп
рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдИ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реВрдЪреА рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдЧреА рдХрд┐ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рддреБрд░рдВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЙрдирдХреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдордХрдХреНрд╖ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВред
рд╕рдВрдпреЛрдЬреА рдмрдВрдзрди рдХрд╛рд░реНрдп
рдпреЗ рд╡реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдпрд╛ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдпрд╛ рди рд╣реЛ:
assign(protocol,socket)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдЪреНрдЪрд╛ (рдкреНрд░рд╛рдХреГрддрд┐рдХ) рд╕реЙрдХреЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЕрд░реНрдерд╛рдд, рдЬрдм рдХрдЪреНрдЪреЗ рд╕реЙрдХреЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рд╣реЛрдВ)редopen(protocol)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдИрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (v4 рдпрд╛ v6) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдпреВрдбреАрдкреА / рдЖрдИрд╕реАрдПрдордкреА рд╕реЙрдХреЗрдЯ рдпрд╛ рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗbind(endpoint)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рдкрддреЗ рд╕реЗ рд╕рдВрдмрджреНрдз рд╣реИредconnect(endpoint)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЗрд╕ рдкрддреЗ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИредasync_connect(endpoint)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЗрд╕ рдкрддреЗ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИредis_open()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рд╣реИ рдпрджрд┐ рд╕реЙрдХреЗрдЯ рдЦреБрд▓рд╛ рд╣реИредclose()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдВрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реЙрдХреЗрдЯ рдкрд░ рдХреЛрдИ рднреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рддреБрд░рдВрдд рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ error::operation_aborted
рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИредshutdown(type_of_shutdown)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж send , receive
рдпрд╛ рджреЛрдиреЛрдВ рдСрдкрд░реЗрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИредcancel()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рд╕реЙрдХреЗрдЯ рдкрд░ рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реЙрдХреЗрдЯ рдкрд░ рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рддреБрд░рдВрдд рдкреВрд░реЗ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдПрдХ error::operation_aborted
рддреНрд░реБрдЯрд┐ рдХреЛрдб рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 80); ip::tcp::socket sock(service); sock.open(ip::tcp::v4()); sock.connect(ep); sock.write_some(buffer("GET /index.html\r\n")); char buff[1024]; sock.read_some(buffer(buff,1024)); sock.shutdown(ip::tcp::socket::shutdown_receive); sock.close();
рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ рдХрд╛рд░реНрдп
рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реЙрдХреЗрдЯ рдкрд░ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ void handler(const boost::system::error_code& e, size_t bytes);
ред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдЦреБрдж:
async_receive(buffer, [flags,] handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИредasync_read_some(buffer,handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди async_receive(buffer, handler)
рдмрд░рд╛рдмрд░ рд╣реИредasync_receive_from(buffer, endpoint[, flags], handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИредasync_send(buffer [, flags], handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрдлрд░ рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИasync_write_some(buffer, handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди async_send(buffer, handler)
рдмрд░рд╛рдмрд░ рд╣реИредasync_send_to(buffer, endpoint, handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрдлрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИредreceive(buffer [, flags])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдмрдлрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рддрдм рддрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛ рдЖрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИread_some(buffer)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди receive(buffer)
рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИредreceive_from(buffer, endpoint [, flags])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЗрд╕ рдмрдлрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрддреЗ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рддрдм рддрдХ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛ рдЖрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рдпрд╛ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИредsend(buffer [, flags])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╛рдЗрдирд░реА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредwrite_some(buffer)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди send(buffer)
рдмрд░рд╛рдмрд░ рд╣реИредsend_to(buffer, endpoint [, flags])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрдлрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕ рдкрддреЗ рдкрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдбреЗрдЯрд╛ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредavailable()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд┐рдирд╛ рдЕрд╡рд░реЛрдз рдХреЗ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдЭрдВрдбреЗ рдХреЛ рджреЗрдЦреЗрдВред рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 0 рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдпреЛрдЬрди рд╕рдВрднрд╡ рд╣реИрдВ:
ip::socket_type::socket::message_peek
: рдпрд╣ рдзреНрд╡рдЬ рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛редip::socket_type::socket::message_out_of_band
: рдпрд╣ рдзреНрд╡рдЬ рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред OOB рдбреЗрдЯрд╛ рд╡рд╣ рдбреЗрдЯрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред OOB рдбреЗрдЯрд╛ рдХреА рдПрдХ рдЪрд░реНрдЪрд╛ рдЗрд╕ рдкреБрд╕реНрддрдХ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИредip::socket_type::socket::message_do_not_route
: рдпрд╣ рдзреНрд╡рдЬ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредip::socket_type::socket::message_end_of_record:
рдпрд╣ рдзреНрд╡рдЬ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдорд╛рд░реНрдХрд░ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реЛ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ message_peek
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:
char buff[1024]; sock.receive(buffer(buff), ip::tcp::socket::message_peek ); memset(buff,1024, 0);
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рджреЗрддреЗ рд╣реИрдВ:
- рдЙрджрд╛рд╣рд░рдг 1: рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯ рдореЗрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП:
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 80); ip::tcp::socket sock(service); sock.connect(ep); sock.write_some(buffer("GET /index.html\r\n")); std::cout << "bytes available " << sock.available() << std::endl; char buff[512]; size_t read = sock.read_some(buffer(buff));
- рдЙрджрд╛рд╣рд░рдг 2: рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛:
ip::udp::socket sock(service); sock.open(ip::udp::v4()); ip::udp::endpoint receiver_ep("87.248.112.181", 80); sock.send_to(buffer("testing\n"), receiver_ep); char buff[512]; ip::udp::endpoint sender_ep; sock.receive_from(buffer(buff), sender_ep);
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм receive_from
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ UDP рд╕реЙрдХреЗрдЯ рд╕реЗ receive_from
, рддреЛ рдЖрдкрдХреЛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдЙрджрд╛рд╣рд░рдг 3: рдпреВрдбреАрдкреА рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рдирд╛:
using namespace boost::asio; io_service service; ip::udp::socket sock(service); boost::asio::ip::udp::endpoint sender_ep; char buff[512]; void on_read(const boost::system::error_code & err, std::size_t read_bytes) { std::cout << "read " << read_bytes << std::endl; sock.async_receive_from(buffer(buff), sender_ep, on_read); } int main(int argc, char* argv[]) { ip::udp::endpoint ep( ip::address::from_string("127.0.0.1"), 8001); sock.open(ep.protocol()); sock.set_option(boost::asio::ip::udp::socket::reuse_ address(true)); sock.bind(ep); sock.async_receive_from(buffer(buff,512), sender_ep, on_read); service.run(); }
рд╕реЙрдХреЗрдЯ рдкреНрд░рдмрдВрдзрди
рдпреЗ рдХрд╛рд░реНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЙрдХреЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
get_io_service()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди io_service
рдЗрдВрд╕реНрдЯреЗрдВрд╕ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ io_service
рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛редget_option(option)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИset_option(option)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИio_control(cmd)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдкрд░ I / O рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдк рд╕реЙрдХреЗрдЯ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд / рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдкрд╣рд▓рд╛ рдирд╛рдо | рдкрд░рд┐рднрд╛рд╖рд╛ | рдЯрд╛рдЗрдк |
---|
broadcast | рдпрджрд┐ true , рддреЛ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ | bool |
debug | рдпрджрд┐ true , рддреЛ рд╕реЙрдХреЗрдЯ рд╕реНрддрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ | bool |
do_not_route | рдпрджрд┐ true , рддреЛ рдпрд╣ рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ | bool |
enable_connection_aborted | рдпрджрд┐ true , рддреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ | bool |
keep_alive | рдЕрдЧрд░ true , рддреЛ keep-alives рднреЗрдЬреЗрдВ | bool |
linger | рдпрджрд┐ true , рддреЛ рд╕реЙрдХреЗрдЯ close() рд╕реЗ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИ close() , рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЧрдП рд╣реИрдВ рдбреЗрдЯрд╛ | bool |
receive_buffer_size | рдмрдлрд╝рд░ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ | int |
receive_low_watemark | рдЗрдирдкреБрдЯ рд╕реЙрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдиреНрдпреВрдирддрдо рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ | int |
reuse_address | рдпрджрд┐ true , рддреЛ рд╕реЙрдХреЗрдЯ рдПрдХ рдкрддреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ | bool |
send_buffer_size | рдмрдлрд░ рдЖрдХрд╛рд░ рднреЗрдЬреЗрдВ | int |
send_low_watermark | рдЖрдЙрдЯрдкреБрдЯ рд╕реЙрдХреЗрдЯ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред | int |
ip::v6_only | рдпрджрд┐ true , рддреЛ рдХреЗрд╡рд▓ IPv6 рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред | bool |
рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо рд╕реЙрдХреЗрдЯ рдпрд╛ рдХреНрд▓рд╛рд╕ рдХреЗ рдЖрдВрддрд░рд┐рдХ typedef
рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 80); ip::tcp::socket sock(service); sock.connect(ep);
рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЙрдХреЗрдЯ рдЦреБрд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЯреАрд╕реАрдкреА рдмрдирд╛рдо рдпреВрдбреАрдкреА рдФрд░ рдЖрдИрд╕реАрдПрдордкреА
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╕рднреА рд╕реЙрдХреЗрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рд╕реВрдЪреА рд╕рдВрдХрд▓рд┐рдд рдХреА рд╣реИ рдЬрд╣рд╛рдБ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рд╕реЙрдХреЗрдЯ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ:
рдирд╛рдо | рдЯреАрд╕реАрдкреА | рдпреВрдбреАрдкреА | ICMP |
---|
async_read_some | рд╣рд╛рдВ | - | - |
async_write_some | рд╣рд╛рдВ | - | - |
async_send_to | - | рд╣рд╛рдВ | рд╣рд╛рдВ |
read_some | рд╣рд╛рдВ | - | - |
receive_from | - | рд╣рд╛рдВ | рд╣рд╛рдВ |
write_some | рд╣рд╛рдВ | - | - |
send_to | - | рд╣рд╛рдВ | рд╣рд╛рдВ |
рдЕрдиреНрдп рдХрд╛рд░реНрдп
рдХрдиреЗрдХреНрд╢рди рдпрд╛ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреНрдп рдХрд╛рд░реНрдп:
local_endpoint()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдбреНрд░реЗрд╕ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕реЙрдХреЗрдЯ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИредremote_endpoint()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрди рджреВрд░рд╕реНрде рдкрддреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╕реЙрдХреЗрдЯ рдЬреБрдбрд╝рд╛ рдерд╛редnative_handle()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд╛рдл рд╕реЙрдХреЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрдк Boost.Asio рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХреНрд▓реАрди рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВредnon_blocking()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди true
рдпрджрд┐ рд╕реЙрдХреЗрдЯ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╣реИ, рдЕрдиреНрдпрдерд╛ false
редnative_non_blocking()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди true
рдпрджрд┐ рд╕реЙрдХреЗрдЯ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╣реИ, рдЕрдиреНрдпрдерд╛ false
ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрджреНрдз рдПрдкреАрдЖрдИ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░реЗрдЧрд╛ред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ( non_blocking()
рд╣рдореЗрд╢рд╛ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ); рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрдк native_handle()
рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВредat_mark()
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди true
, рдпрджрд┐ рдЖрдк OOB рд╕реЙрдХреЗрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕рдХреА рдЬрд░реВрд░рдд рдмрд╣реБрдд рдХрдо рдкрдбрд╝рддреА рд╣реИред
рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╕реЙрдХреЗрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ operator=
рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред
ip::tcp::socket s1(service), s2(service); s1 = s2;
рдпрд╣ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реНрдЯреЛрд░ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕реЙрдХреЗрдЯ)ред рдпрджрд┐ рд╣рдордиреЗ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЕрдВрдд рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕реЙрдХреЗрдЯ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ; рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рддреЛ рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рдкрд╛рд╕ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рдпрд╛ рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рдзрд┐)ред Boost.Asio рдореЗрдВ, рдпрд╣ рдирдХрд▓ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рдерд╛ (рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ рд╕рд╛рдЭрд╛ ( shared
) рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr; socket_ptr sock1(new ip::tcp::socket(service)); socket_ptr sock2(sock1);
рд╕реЙрдХреЗрдЯ рдмрдлрд╝рд░реНрд╕
рд╕реЙрдХреЗрдЯ рдХреЛ рдкрдврд╝рддреЗ рдпрд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдПрдХ рдмрдлрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрдирдХрдорд┐рдВрдЧ рдпрд╛ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ред рдмрдлрд░ рдореЗрдореЛрд░реА рдХреЛ I / O рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП; рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рддрдХ рдЗрд╕реЗ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ рдЬрдмрдХрд┐ I / O рд╕рдВрдЪрд╛рд▓рди рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ред
рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ; buff
, buff
рдХреЛ рдЬреАрд╡рд┐рдд рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдВрдЪрд╛рд▓рди receive
рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
char buff[512]; ... sock.receive(buffer(buff)); strcpy(buff, "ok\n"); sock.send(buffer(buff));
рдФрд░ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
async_receive()
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, async_receive()
рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реЙрдХреЗрдЯ рдкрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ; рдЗрд╕реЗ рдпрд╛ рддреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд░ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕рднреА рдореЗрдВ рд╕реНрдореГрддрд┐ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:
- рд╡реИрд╢реНрд╡рд┐рдХ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- рдПрдХ рдмрдлрд░ рдмрдирд╛рдПрдВ рдФрд░ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдирд╖реНрдЯ рдХрд░ рджреЗрдВ
- рд╕реЙрдХреЗрдЯ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдЬреИрд╕реЗ рдХрд┐ рдмрдлрд░ (рдПрд╕) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЪрд╛рд░ рд╡рд╕реНрддреБ рд╣реИред
рдкрд╣рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдЦрд░рд╛рдм рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рджреЛ рд╣реИрдВрдбрд▓рд░ рдПрдХ рд╣реА рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
void on_read(char * ptr, const boost::system::error_code & err, std::size_t read_bytes) { delete[] ptr; } .... char * buff = new char[512]; sock.async_receive(buffer(buff, 512), boost::bind(on_ read,buff,_1,_2));
рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдмрдлрд░ рд╕реНрд╡рддрдГ рд╕реНрдХреЛрдк рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рдП, рддреЛ рдПрдХ shared pointer
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
struct shared_buffer { boost::shared_array<char> buff; int size; shared_buffer(size_t size) : buff(new char[size]), size(size) {} mutable_buffers_1 asio_buff() const { return buffer(buff.get(), size); } };
shared_buffer
рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрд╡рдпрдВ shared_array<>
рдХрд┐рдпрд╛ рдЧрдпрд╛ shared_array<>
, рдЬреЛ shared_buffer
рдЙрджрд╛рд╣рд░рдг рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИ, рдЗрд╕рд▓рд┐рдП shared_array <>
рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛; рдЬрдм рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ shared_array <>
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдврд╣ рдЬрд╛рдПрдЧрд╛, рдмрд╕ рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рдереЗред
рдпрд╣ Boost.Asio рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд░рдЦреЗрдЧрд╛ред рдпрд╣ рдХреЙрдкреА boost::bind
рдлрдирдХрд╛рд░ рд╣реИ, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ shared_buffer
рдЙрджрд╛рд╣рд░рдг рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рд╛рдл рд╣реИ!
рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╕рдВрдЪрд╛рд░ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕реЙрдХреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдмрдлрд╝рд░реНрд╕, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИ, рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдмрдлрд░ рдлрдВрдХреНрд╢рди рд░реИрдкрд░
рдЙрд╕ рдХреЛрдб рдореЗрдВ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛, рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЛрдб рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдлрд░ рдХреА рд╡рд╕реНрддреБ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛, buffer()
рдХреЛ рдХреЙрд▓ buffer()
рдФрд░ рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ:
char buff[512]; sock.async_receive(buffer(buff), on_read
рдЕрд╕рд▓ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рднреА рдмрдлрд░ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдмрдлрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Boost.Asio рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд╣реЗрдВ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
sock.async_receive(some_buffer, on_read);
some_buffer
рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН ConstBufferSequence
рдпрд╛ MutableBufferSequence
(рдЖрдк Boost.Asio рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдХрдХреНрд╖рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди Boost.Asio рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╡рд░реНрдЧ рд╣реИрдВ рдЬреЛ рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдореЙрдбрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ; рдЖрдк buffer()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЖрдк buffer()
рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ buffer()
рдлрд╝рдВрдХреНрд╢рди:
- рдкрд╛рддреНрд░реЛрдВ рдХреА рдирд┐рд░рдВрддрд░ рд╕рд░рдгреА
void*
рдФрд░ рдЪрд░рд┐рддреНрд░ рдХрд╛ рдЖрдХрд╛рд░- string
std::string
- рдирд┐рд░рдВрддрд░ рд╕рд░рдгреА POD [] (POD рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЕрд░реНрдерд╛рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)
- рд╕рд░рдгреА
std::vector
рдХрд┐рд╕реА рднреА POD рд╕реЗ boost::array
рдХрд┐рд╕реА рднреА POD рд╕реЗ boost::array
- рд╕рд░рдгреА
std::array
рдХрд┐рд╕реА рднреА POD рд╕реЗ std::array
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:
struct pod_sample { int i; long l; char c; }; ... char b1[512]; void * b2 = new char[512]; std::string b3; b3.resize(128); pod_sample b4[16]; std::vector<pod_sample> b5; b5.resize(16); boost::array<pod_sample,16> b6; std::array<pod_sample,16> b7; sock.async_send(buffer(b1), on_read); sock.async_send(buffer(b2,512), on_read); sock.async_send(buffer(b3), on_read); sock.async_send(buffer(b4), on_read); sock.async_send(buffer(b5), on_read); sock.async_send(buffer(b6), on_read); sock.async_send(buffer(b7), on_read);
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, ConstBufferSequence
рдпрд╛ MutableBufferSequence
ConstBufferSequence
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдХрдХреНрд╖рд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрдлрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдФрд░ mutable_ buffers_1
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг mutable_ buffers_1
, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред shared_buffer
рдкрд╣рд▓реЗред
рд╕реНрд╡рддрдВрддреНрд░ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ / рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ
Boost.Asio рдЖрдкрдХреЛ рд╕реНрд╡рддрдВрддреНрд░ I / O рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЪрд╛рд░ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ред
рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдпреЗ рдХрд╛рд░реНрдп рдПрдХ рд╕реЙрдХреЗрдЯ рдпрд╛ рдЕрдВрддрд┐рдо рдкрддреЗ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
connect(socket, begin [, end] [, condition])
: , begin
end
. begin
socket_type::resolver::query
( , ┬л ┬╗ ). , . condition
, . Iterator connect_condition(const boost::system::error_code & err, Iterator next);
ред , , .async_connect(socket, begin [, end] [, condition], handler):
. void handler(const boost::system::error_code & err, Iterator iterator);
ред , ( end ).
:
using namespace boost::asio::ip; tcp::resolver resolver(service); tcp::resolver::iterator iter = resolver.resolve(tcp::resolver::query("www.yahoo.com","80")); tcp::socket sock(service); connect(sock, iter);
, connect
async_connect
, ; .
/
( , ):
async_read(stream, buffer [, completion] ,handler)
: . . void handler(const boost::system::error_code & err, size_t bytes);
ред completion . Completion
read
, Boost.Asio async_read
( , ). size_t completion (const boost::system::error_code& err, size_t bytes_transfered)
. 0, , ; , , async_read_some
. .async_write(stream, buffer [, completion], handler)
: . async_read
.read(stream, buffer [, completion])
: . async_read
write(stream, buffer [, completion])
: . async_read
.async_read(stream, stream_buffer [, completion], handler)
async_write(strean, stream_buffer [, completion], handler)
write(stream, stream_buffer [, completion])
read(stream, stream_buffer [, completion])
- , . , . , Windows.
:
- ( ) ( ).
Completion
0 ( ).- .
, '\n':
io_service service; ip::tcp::socket sock(service); char buff[512]; int offset = 0; size_t up_to_enter(const boost::system::error_code &, size_t bytes) { for ( size_t i = 0; i < bytes; ++i) if ( buff[i + offset] == '\n') return 0; return 1; } void on_read(const boost::system::error_code &, size_t) {} ... async_read(sock, buffer(buff), up_to_enter, on_read);
, Boost.Asio completion
:
- transfer_at_least(n)
- transfer_exactly(n)
- transfer_all()
:
char buff[512]; void on_read(const boost::system::error_code &, size_t) {}
stream_buffer
Boost.Asio, std::streambuf
. STL , :
io_service service; void on_read(streambuf& buf, const boost::system::error_code &, size_t) { std::istream in(&buf); std::string line; std::getline(in, line); std::cout << "first line: " << line << std::endl; } int main(int argc, char* argv[]) { HANDLE file = ::CreateFile("readme.txt", GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,0); windows::stream_handle h(service, file); streambuf buf; async_read(h, buf, transfer_exactly(256), boost::bind(on_read,boost::ref(buf),_1,_2)); service.run(); }
, async_read
( - ) Windows. 256 . , on_read
, std::istream
, ( std::getline
) .
read_until/async_read_until
:
async_read_until(stream, stream_buffer, delim, handler)
: . ( delim
). , std::string
boost::regex
. void handler(const boost::system::error_code & err, size_t bytes);
редasync_read_until(stream, stream_buffer, completion, handler)
: , . pair<iterator,bool> completion(iterator begin, iterator end);
, buffers_iterator<streambuf::const_buffers_type>
. , . ( begin, end
) . ; ; true
, , , false
.read_until(stream, stream_buffer, delim)
: . async_read_until
.
:
typedef buffers_iterator<streambuf::const_buffers_type> iterator; std::pair<iterator, bool> match_punct(iterator begin, iterator end) { while ( begin != end) if ( std::ispunct(*begin)) return std::make_pair(begin,true); return std::make_pair(end,false); } void on_read(const boost::system::error_code &, size_t) {} ... streambuf buf; async_read_until(sock, buf, match_punct, on_read);
, :
async_read_until(sock, buff, ' ', on_read);
*_at
/ . , / ( ):
async_read_at(stream, offset, buffer [, completion], handler)
: , offset
. handler (const boost::system::error_code& err, size_t bytes);
ред buffer()
streambuf
. , Boost.Asio async_read_at operation
( , ). size_t completion(const boost::system::error_code& err, size_t bytes);
ред 0, , , , , async_read_some_at
.async_write_at(stream, offset, buffer [, completion], handler)
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░рд╛рдЗрдЯ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди рд╣реИрдВ async_read_at
редread_at(stream, offset, buffer [, completion])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдПрдХ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкрдврд╝рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди рд╣реИрдВ async_read_at
редread_at(stream, offset, buffer [, completion])
: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдПрдХ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкрдврд╝рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рди рд╣реИрдВ async_read_at
ред
рдпреЗ рдХрд╛рд░реНрдп рд╕реЙрдХреЗрдЯреНрд╕ рд╕реЗ рдирд╣реАрдВ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рд╡реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрднрд┐рдЧрдо рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ; рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрди рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдЬрд┐рдиреНрд╣реЗрдВ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЙрдХреЗрдЯреНрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ (рд╕реЙрдХреЗрдЯреНрд╕ рд╣реИрдВ forward-only
)ред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдлрд╛рдЗрд▓ рд╕реЗ 128 рдмрд╛рдЗрдЯ рдХреИрд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рд╢реБрд░реБрдЖрдд 256 рд╕реЗ рд╣реЛрддреА рд╣реИ:
io_service service; int main(int argc, char* argv[]) { HANDLE file = ::CreateFile("readme.txt", GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,0); windows::random_access_handle h(service, file); streambuf buf; read_at(h, 256, buf, transfer_exactly(128)); std::istream in(&buf); std::string line; std::getline(in, line); std::cout << "first line: " << line << std::endl; }
рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдк рд╕рднреА рдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдореИрдВ рдЬрд╡рд╛рдм рдЬрд░реВрд░ рджреВрдВрдЧрд╛ред
рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!