@@ -18,36 +18,26 @@ USERVER_NAMESPACE_BEGIN
1818
1919namespace engine ::io {
2020
21- IpMreq::IpMreq (const char * imr_multiaddr, const char * imr_interface) : family_{AF_INET} {
21+ IpMreq::IpMreq (const char * ip_multiaddr, unsigned int interface_index) {
2222 data_.ip_req = {};
23- struct ip_mreq * imr_ptr = &data_.ip_req ;
24- if (::inet_pton (AF_INET, imr_multiaddr, &imr_ptr->imr_multiaddr ) != 1 ) {
25- throw IpMulticastRequestException (
26- fmt::format (" Invalid IPv4 multicast address: {}" , imr_multiaddr)
27- );
23+ if (inet_pton (AF_INET, ip_multiaddr, &data_.ip_req .imr_multiaddr ) == 1 ) {
24+ // imr_address field is not set since it's not used if imr_ifindex presents
25+ family_ = AF_INET;
26+ data_.ip_req .imr_ifindex = interface_index;
2827 }
29- if (imr_interface != nullptr ) {
30- if (::inet_pton (AF_INET, imr_interface, &imr_ptr->imr_interface ) != 1 ) {
28+ else {
29+ data_.ipv6_req = {};
30+ if (inet_pton (AF_INET6, ip_multiaddr, &data_.ipv6_req .ipv6mr_multiaddr ) == 1 ) {
31+ family_ = AF_INET6;
32+ data_.ipv6_req .ipv6mr_interface = interface_index;
33+ } else {
3134 throw IpMulticastRequestException (
32- fmt::format (" Invalid IPv4 interface address: {}" , imr_interface )
35+ fmt::format (" Invalid IP address: {}" , ip_multiaddr )
3336 );
3437 }
35- } else {
36- imr_ptr->imr_interface .s_addr = htonl (INADDR_ANY);
3738 }
3839}
3940
40- IpMreq::IpMreq (const char * ipv6mr_multiaddr, unsigned int ipv6mr_interface) : family_{AF_INET6} {
41- data_.ipv6_req = {};
42- struct ipv6_mreq * req = &data_.ipv6_req ;
43- if (inet_pton (AF_INET6, ipv6mr_multiaddr, &req->ipv6mr_multiaddr ) != 1 ) {
44- throw IpMulticastRequestException (
45- fmt::format (" Invalid IPv6 address: {}" , ipv6mr_multiaddr)
46- );
47- }
48- req->ipv6mr_interface = ipv6mr_interface;
49- }
50-
5141Sockaddr Sockaddr::MakeUnixSocketAddress (std::string_view path) {
5242 Sockaddr addr;
5343 auto * sa = addr.As <struct sockaddr_un >();
0 commit comments