[asio :: udp] рдиреЙрди-рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡реНрдпрд╡рд╣рд╛рд░

рддреЛ, рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рд░реНрд╡рд░ рд╣реИ рдЬрд┐рд╕реЗ рдпреВрдбреАрдкреА рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Asio рдХреЗ рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░, рдЖрдк рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

udp::socket receiver(ios, udp::endpoint(udp::v4(), port)); char read_buf[buf_len]; udp::endpoint sender_point; receiver.receive_from(buffer(read_buf, sizeof(read_buf)), sender_point); 


рдпрджрд┐ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

Win / LINUX рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдмреЗрдореЗрд▓ рд╣реЛрдЧрд╛ред рд▓рд┐рдирдХреНрд╕ рдкрд░, рдСрдкрд░реЗрд╢рди рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓реЗрдЧрд╛, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдмрд╛рдХреА рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рди рдкрд░, рдЖрдкрдХреЛ рд░реАрдб рдбреЗрдЯрд╛ рднреА рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рднреА рдорд┐рд▓реЗрдЧрд╛ред

рдФрд░ рдпрд╣рд╛рдБ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ:

Get_from рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдп рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реИ

 #if defined(BOOST_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count, &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0), ec); *addrlen = (std::size_t)tmp_addrlen; ... if (result != 0) return socket_error_retval; ec = boost::system::error_code(); return bytes_transferred; #else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); init_msghdr_msg_name(msg.msg_name, addr); msg.msg_namelen = *addrlen; msg.msg_iov = bufs; msg.msg_iovlen = count; int result = error_wrapper(::recvmsg(s, &msg, flags), ec); *addrlen = msg.msg_namelen; if (result >= 0) ec = boost::system::error_code(); return result; 


рд╡рд┐рди рдХреЗ рд▓рд┐рдП WSARecvFrom рдФрд░ рд╕реЙрдХреЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП recvmsg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо (рд╕рдлрд▓ / рд╕рдлрд▓ рдирд╣реАрдВ) рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 template <typename ReturnType> inline ReturnType error_wrapper(ReturnType return_value, boost::system::error_code& ec) { #if defined(BOOST_WINDOWS) || defined(__CYGWIN__) ec = boost::system::error_code(WSAGetLastError(), boost::asio::error::get_system_category()); #else ec = boost::system::error_code(errno, boost::asio::error::get_system_category()); #endif return return_value; } 


WSARecvFrom рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИ:

рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдСрдкрд░реЗрд╢рди рддреБрд░рдВрдд рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ WSARecvFrom рд╢реВрдиреНрдп рджреЗрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, SOCKET_ERROR рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ WSAGetLastError рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:

WSAEMSGSIZE
рдпрд╣ рд╕рдВрджреЗрд╢ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрдлрд╝рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рдерд╛ рдФрд░ (рдХреЗрд╡рд▓ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП) рд╕рдВрджреЗрд╢ рдХрд╛ рдХреЛрдИ рдЕрдиреБрдЧрд╛рдореА рднрд╛рдЧ рдЬреЛ рдмрдлрд╝рд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛, рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЖрд░рдИрд╡реА рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдорд┐рд▓рддреА рд╣реИ , рдпрд╛ рддреНрд░реБрдЯреА рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ -1ред рд▓реЗрдХрд┐рди рдЙрд╕рдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдКрдкрд░ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ рдПрдХ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб msg_flags рдлрд╝реАрд▓реНрдб рдореЗрдВ recvmsg рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕реЗ asio рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):

MSG_TRUNC
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреИрдХреЗрдЯ рд▓рдВрдмрд╛рдИ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдмрдлрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред рдпрд╣ рдзреНрд╡рдЬ рдХреЗрд╡рд▓ рдкреИрдХреЗрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рди рдореЗрдВ рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдХреЛ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕рд╣реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ asio рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдЧрд╛рдореА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рди рдХреЗ рддрд╣рдд рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреЛ рдПрдХ рдбреАрдЯрд╛рдЧреНрд░рд╛рдо рдирд╣реАрдВ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рднреА рд╣рдо рдФрд░ рднреА рднрдпрд╛рд╡рд╣ рдмреЗрдореЗрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ (рд╕рднреА рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдпреЛрдЧ) рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░, рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ (рдЕрдЧрд▓реЗ рд░реАрдб рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рд╕реНрд░реЛрдд

рдЖрдЙрдЯрдкреБрдЯ рдЬреАрдд:

рдЕрдкрд╡рд╛рдж: get_from: рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рд╕реЙрдХреЗрдЯ рдХреЛ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╕рдВрджреЗрд╢ рдЖрдВрддрд░рд┐рдХ рд╕рдВрджреЗрд╢ рдмрдлрд░ рд╕реЗ рдмрдбрд╝рд╛ рдерд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рдерд╛ред рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд░ рд╕рдВрджреЗрд╢ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЫреЛрдЯрд╛ рдерд╛ред
рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг
рдЙрдкрд▓рдмреНрдз: 36
рдЙрдкрд▓рдмреНрдз: 18
рдЙрдкрд▓рдмреНрдз: 0

рдЖрдЙрдЯрдкреБрдЯ рд▓рд┐рдирдХреНрд╕:

рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг
рдЙрдкрд▓рдмреНрдз: 18
рдЙрдкрд▓рдмреНрдз: 18
рдЙрдкрд▓рдмреНрдз: 0


рдмреВрд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг 1.44 рдФрд░ 1.49 рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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


All Articles