@@ -68,6 +68,30 @@ Error PacketPeerUDP::leave_multicast_group(IPAddress p_multi_address, const Stri
6868 return _sock->leave_multicast_group (p_multi_address, p_if_name);
6969}
7070
71+ Error PacketPeerUDP::set_multicast_send_interface (const String &p_if_name) {
72+ ERR_FAIL_COND_V (_sock.is_null (), ERR_UNAVAILABLE);
73+ ERR_FAIL_COND_V (p_if_name.is_empty (), ERR_INVALID_PARAMETER);
74+
75+ Error err = OK;
76+
77+ if (!_sock->is_open ()) {
78+ IP::Type ip_type = IP::TYPE_ANY;
79+ // Later, in this file, this is used:
80+ // IP::Type ip_type = peer_addr.is_ipv4() ? IP::TYPE_IPV4 : IP::TYPE_IPV6
81+ // But, TYPE_ANY is be the default when calling PacketPeerUDP.bind(), so that is why I used it here
82+ err = _sock->open (NetSocket::Family::INET, NetSocket::TYPE_UDP, ip_type);
83+ ERR_FAIL_COND_V (err != OK, err);
84+ _sock->set_blocking_enabled (false );
85+ _sock->set_broadcasting_enabled (broadcast);
86+ }
87+
88+ err = _sock->set_multicast_send_interface (p_if_name);
89+ ERR_FAIL_COND_V (err != OK, err);
90+
91+ // err is at this point guaranteed to be OK, but keep it simple.
92+ return err;
93+ }
94+
7195String PacketPeerUDP::_get_packet_ip () const {
7296 return String (get_packet_address ());
7397}
@@ -373,6 +397,7 @@ void PacketPeerUDP::_bind_methods() {
373397 ClassDB::bind_method (D_METHOD (" set_broadcast_enabled" , " enabled" ), &PacketPeerUDP::set_broadcast_enabled);
374398 ClassDB::bind_method (D_METHOD (" join_multicast_group" , " multicast_address" , " interface_name" ), &PacketPeerUDP::join_multicast_group);
375399 ClassDB::bind_method (D_METHOD (" leave_multicast_group" , " multicast_address" , " interface_name" ), &PacketPeerUDP::leave_multicast_group);
400+ ClassDB::bind_method (D_METHOD (" set_multicast_send_interface" , " interface_name" ), &PacketPeerUDP::set_multicast_send_interface);
376401}
377402
378403PacketPeerUDP::PacketPeerUDP () :
0 commit comments