From e3a5c160847666a7fa780d1c78aa7551ea4b7b93 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Sun, 5 May 2024 20:22:23 +0200 Subject: [PATCH 01/14] [multicast_mdns] Optimized Socket Binding: Consolidated to 0.0.0.0 for Simplicity and Efficiency --- packages/multicast_dns/lib/multicast_dns.dart | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 336ac427930..4098a15595f 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -132,28 +132,6 @@ class MDnsClient { for (final NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. final InternetAddress targetAddress = interface.addresses[0]; - final RawDatagramSocket socket = await _rawDatagramSocketFactory( - targetAddress, - selectedMDnsPort, - reuseAddress: true, - reusePort: true, - ttl: 255, - ); - _sockets.add(socket); - // Ensure that we're using this address/interface for multicast. - if (targetAddress.type == InternetAddressType.IPv4) { - socket.setRawOption(RawSocketOption( - RawSocketOption.levelIPv4, - RawSocketOption.IPv4MulticastInterface, - targetAddress.rawAddress, - )); - } else { - socket.setRawOption(RawSocketOption.fromInt( - RawSocketOption.levelIPv6, - RawSocketOption.IPv6MulticastInterface, - interface.index, - )); - } // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } From 852a12d1a99dcb4a8cde1acd99df69a3305e9742 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Thu, 9 May 2024 09:55:22 +0200 Subject: [PATCH 02/14] Updated CHANGELOG.md and README.md --- packages/multicast_dns/CHANGELOG.md | 1 + packages/multicast_dns/README.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 1ea1abcd63e..8773d5b1065 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,6 +1,7 @@ ## NEXT * Updates minimum supported SDK version to Flutter 3.13/Dart 3.1. +* Optimized Socket Binding: Consolidated to 0.0.0.0 for Simplicity and Efficiency ## 0.3.2+6 diff --git a/packages/multicast_dns/README.md b/packages/multicast_dns/README.md index 10cd33e4bb6..c161b6fd98d 100644 --- a/packages/multicast_dns/README.md +++ b/packages/multicast_dns/README.md @@ -1,5 +1,7 @@ # Multicast DNS package +Based on [RFC 6762 Multicast DNS](https://datatracker.ietf.org/doc/html/rfc6762). + [![pub package](https://img.shields.io/pub/v/multicast_dns.svg)]( https://pub.dartlang.org/packages/multicast_dns) From f5bbe17a450ce4ecae0e1a42c8a422a400919663 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Thu, 9 May 2024 13:51:55 +0200 Subject: [PATCH 03/14] Removed unused variable --- packages/multicast_dns/lib/multicast_dns.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 4098a15595f..b350269c509 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -130,8 +130,6 @@ class MDnsClient { (await interfacesFactory(listenAddress.type)).toList(); for (final NetworkInterface interface in interfaces) { - // Create a socket for sending on each adapter. - final InternetAddress targetAddress = interface.addresses[0]; // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } From 565476009a91c269ebf010a7c09452cbad239203 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Fri, 24 May 2024 20:40:32 +0200 Subject: [PATCH 04/14] Applied feedback from review pt.1 : CHANGELOG.md updated --- packages/multicast_dns/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 3af85e47891..e80cffdc131 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,7 +1,7 @@ ## NEXT -* Updates minimum supported SDK version to Flutter 3.13/Dart 3.2. -* Optimized Socket Binding: Consolidated to 0.0.0.0 for Simplicity and Efficiency +* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. +* Optimized Socket Binding: Always bind to 0.0.0.0 for simplicity and efficiency. ## 0.3.2+6 From 2f693bc1608d0972d77bf15f57a40a57083646fb Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Fri, 24 May 2024 23:38:26 +0200 Subject: [PATCH 05/14] Applied feedback from review pt.1 : removed socket list and updated automated tests in client_test.dart --- packages/multicast_dns/lib/multicast_dns.dart | 28 +++---- packages/multicast_dns/test/client_test.dart | 83 +++++++++++++++++++ 2 files changed, 94 insertions(+), 17 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index b350269c509..7b3575d8223 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -48,8 +48,8 @@ class MDnsClient { bool _starting = false; bool _started = false; - final List _sockets = []; - final List _toBeClosed = []; + RawDatagramSocket? _incomingIPv4; + RawDatagramSocket? _incomingIPv6; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); final RawDatagramSocketFactory _rawDatagramSocketFactory; @@ -117,9 +117,9 @@ class MDnsClient { // Can't send to IPv6 any address. if (incoming.address != InternetAddress.anyIPv6) { - _sockets.add(incoming); + _incomingIPv4 = incoming; } else { - _toBeClosed.add(incoming); + _incomingIPv6 = incoming; } _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 @@ -147,15 +147,8 @@ class MDnsClient { throw StateError('Cannot stop mDNS client while it is starting.'); } - for (final RawDatagramSocket socket in _sockets) { - socket.close(); - } - _sockets.clear(); - - for (final RawDatagramSocket socket in _toBeClosed) { - socket.close(); - } - _toBeClosed.clear(); + _incomingIPv4?.close(); + _incomingIPv6?.close(); _resolver.clearPendingRequests(); @@ -195,11 +188,12 @@ class MDnsClient { final Stream results = _resolver.addPendingRequest( query.resourceRecordType, query.fullyQualifiedName, timeout); - // Send the request on all interfaces. - final List packet = query.encode(); - for (final RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress!, selectedMDnsPort); + if (_incomingIPv4 == null) { + throw StateError('Unable to send packet on null socket.'); } + + // Send and listen on same "ANY" interface + _incomingIPv4?.send(query.encode(), _mDnsAddress!, selectedMDnsPort); return results; } diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 134d7518d86..3f786c7d21f 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -86,6 +86,67 @@ void main() { await client.start(); await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); }); + + group('Bind a single socket to ANY IPv4/6', () { + final testCases = [ + { + 'name': 'IPv4', + 'datagramSocketType': InternetAddress.anyIPv4, + 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030' + }, + { + 'name': 'IPv6', + 'datagramSocketType': InternetAddress.anyIPv6, + 'interfacePrefix': '192.168.2.' + } + ]; + + for (final testCase in testCases) { + test('Bind a single socket to ANY ${testCase["name"]}', () async { + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); + + datagramSocket.address = + (testCase['datagramSocketType'] as InternetAddress); + + final List selectedInterfacesForSendingPackets = []; + final MDnsClient client = MDnsClient(rawDatagramSocketFactory: + (dynamic host, int port, + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { + selectedInterfacesForSendingPackets.add(host); + return datagramSocket; + }); + + Future> fakeNetworkInterfacesFactory( + InternetAddressType type) async { + final List fakeInterfaces = []; + + // Generate "fake" interfaces + for (int i = 0; i < 10; i++) { + fakeInterfaces.add(FakeNetworkInterface( + 'inetfake$i', + [InternetAddress("${testCase['interfacePrefix'] as String}$i")], + 0, + )); + } + + // Returning the dummy list as a Future + return Future.value(fakeInterfaces); + } + + final InternetAddress listenAddress = + (testCase['datagramSocketType'] as InternetAddress); + await client.start( + listenAddress: listenAddress, + mDnsPort: 1234, + interfacesFactory: fakeNetworkInterfacesFactory); + client.stop(); + expect(selectedInterfacesForSendingPackets.length, 1); + expect(selectedInterfacesForSendingPackets[0], listenAddress.address); + }); + } + }); } class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { @@ -113,4 +174,26 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { int send(List buffer, InternetAddress address, int port) { return buffer.length; } + + @override + void joinMulticast(InternetAddress group, [NetworkInterface? interface]) { + // nothing to do here + } +} + +class FakeNetworkInterface implements NetworkInterface { + FakeNetworkInterface(this._name, this._addresses, this._index); + + final String _name; + final List _addresses; + final int _index; + + @override + List get addresses => _addresses; + + @override + String get name => _name; + + @override + int get index => _index; } From 23ae0aeb91ecebfbc3451f305968963ac7e2af13 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Fri, 24 May 2024 23:42:59 +0200 Subject: [PATCH 06/14] Removed not needed comment in tests --- packages/multicast_dns/test/client_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 3f786c7d21f..072f68b2aa0 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -131,7 +131,6 @@ void main() { )); } - // Returning the dummy list as a Future return Future.value(fakeInterfaces); } From 3efedade09ef7ac49ca01a137cac3db669f87b04 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Fri, 24 May 2024 23:48:26 +0200 Subject: [PATCH 07/14] Applied feedback from review pt.2: set _incomingIPv4 and _incomingIPv6 to null after closing sockets --- packages/multicast_dns/lib/multicast_dns.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 7b3575d8223..77802d956fa 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -149,6 +149,8 @@ class MDnsClient { _incomingIPv4?.close(); _incomingIPv6?.close(); + _incomingIPv4 = null; + _incomingIPv6 = null; _resolver.clearPendingRequests(); From 1feeb9ed014dab3011dd1dc944d50ecba198f54f Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Sat, 25 May 2024 09:48:23 +0200 Subject: [PATCH 08/14] Updated client_test.dart --- packages/multicast_dns/test/client_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 072f68b2aa0..6b3999cfe49 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -92,12 +92,12 @@ void main() { { 'name': 'IPv4', 'datagramSocketType': InternetAddress.anyIPv4, - 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030' + 'interfacePrefix': '192.168.2.' }, { 'name': 'IPv6', 'datagramSocketType': InternetAddress.anyIPv6, - 'interfacePrefix': '192.168.2.' + 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030' } ]; From 67d6cc96f5c63a0d05eac96f3093d32c50c0a53a Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Tue, 28 May 2024 21:17:02 +0200 Subject: [PATCH 09/14] Run fluttter_flugin_tools --- packages/multicast_dns/CHANGELOG.md | 4 ++-- packages/multicast_dns/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index e80cffdc131..6db175a0db9 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,7 +1,7 @@ -## NEXT +## 0.3.2+7 -* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. * Optimized Socket Binding: Always bind to 0.0.0.0 for simplicity and efficiency. +* Updates minimum supported SDK version to Flutter 3.16/Dart 3.2. ## 0.3.2+6 diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 1d6d4341e1e..6621352cc92 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -2,7 +2,7 @@ name: multicast_dns description: Dart package for performing mDNS queries (e.g. Bonjour, Avahi). repository: https://github.com/flutter/packages/tree/main/packages/multicast_dns issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+multicast_dns%22 -version: 0.3.2+6 +version: 0.3.2+7 environment: sdk: ^3.2.0 From 3375a290492067fa6df62c398fbe367fd56f7d72 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Tue, 28 May 2024 21:32:17 +0200 Subject: [PATCH 10/14] Updated client_test.dart because some checks are failing --- packages/multicast_dns/test/client_test.dart | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 6b3999cfe49..4a96367dcc1 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -88,25 +88,25 @@ void main() { }); group('Bind a single socket to ANY IPv4/6', () { - final testCases = [ - { + final List> testCases = >[ + { 'name': 'IPv4', 'datagramSocketType': InternetAddress.anyIPv4, 'interfacePrefix': '192.168.2.' }, - { + { 'name': 'IPv6', 'datagramSocketType': InternetAddress.anyIPv6, 'interfacePrefix': '2001:0db8:85a3:0000:0000:8a2e:7335:030' } ]; - for (final testCase in testCases) { + for (final Map testCase in testCases) { test('Bind a single socket to ANY ${testCase["name"]}', () async { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); datagramSocket.address = - (testCase['datagramSocketType'] as InternetAddress); + testCase['datagramSocketType']! as InternetAddress; final List selectedInterfacesForSendingPackets = []; final MDnsClient client = MDnsClient(rawDatagramSocketFactory: @@ -126,7 +126,9 @@ void main() { for (int i = 0; i < 10; i++) { fakeInterfaces.add(FakeNetworkInterface( 'inetfake$i', - [InternetAddress("${testCase['interfacePrefix'] as String}$i")], + [ + InternetAddress("${testCase['interfacePrefix']! as String}$i") + ], 0, )); } @@ -135,7 +137,7 @@ void main() { } final InternetAddress listenAddress = - (testCase['datagramSocketType'] as InternetAddress); + testCase['datagramSocketType'] as InternetAddress; await client.start( listenAddress: listenAddress, mDnsPort: 1234, From a97962e3fa1034f395343a5b6de288850c72abc1 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Tue, 28 May 2024 21:38:49 +0200 Subject: [PATCH 11/14] Make checks again green --- packages/multicast_dns/test/client_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 4a96367dcc1..6affa172455 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -133,11 +133,12 @@ void main() { )); } + // ignore: always_specify_types return Future.value(fakeInterfaces); } final InternetAddress listenAddress = - testCase['datagramSocketType'] as InternetAddress; + testCase['datagramSocketType']! as InternetAddress; await client.start( listenAddress: listenAddress, mDnsPort: 1234, From 7bfdba08ae0b1eaaaf0088c176f941299b73b203 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Wed, 29 May 2024 21:46:10 +0200 Subject: [PATCH 12/14] Removed unnecessary check --- packages/multicast_dns/lib/multicast_dns.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 77802d956fa..474d3f46199 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -190,10 +190,6 @@ class MDnsClient { final Stream results = _resolver.addPendingRequest( query.resourceRecordType, query.fullyQualifiedName, timeout); - if (_incomingIPv4 == null) { - throw StateError('Unable to send packet on null socket.'); - } - // Send and listen on same "ANY" interface _incomingIPv4?.send(query.encode(), _mDnsAddress!, selectedMDnsPort); return results; From 349b5c7f087561407d42c17595d46bb783c77364 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Sat, 15 Jun 2024 10:26:40 +0200 Subject: [PATCH 13/14] Put back IPv6 logic --- packages/multicast_dns/lib/multicast_dns.dart | 30 ++++++++++++++++--- packages/multicast_dns/test/client_test.dart | 17 +++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 474d3f46199..bbb94183525 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -49,7 +49,7 @@ class MDnsClient { bool _starting = false; bool _started = false; RawDatagramSocket? _incomingIPv4; - RawDatagramSocket? _incomingIPv6; + final List _ipv6InterfaceSockets = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); final RawDatagramSocketFactory _rawDatagramSocketFactory; @@ -119,7 +119,7 @@ class MDnsClient { if (incoming.address != InternetAddress.anyIPv6) { _incomingIPv4 = incoming; } else { - _incomingIPv6 = incoming; + _ipv6InterfaceSockets.add(incoming); } _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 @@ -130,6 +130,25 @@ class MDnsClient { (await interfacesFactory(listenAddress.type)).toList(); for (final NetworkInterface interface in interfaces) { + final InternetAddress targetAddress = interface.addresses[0]; + + // Ensure that we're using this address/interface for multicast. + if (targetAddress.type == InternetAddressType.IPv6) { + final RawDatagramSocket socket = await _rawDatagramSocketFactory( + targetAddress, + selectedMDnsPort, + reuseAddress: true, + reusePort: true, + ttl: 255, + ); + _ipv6InterfaceSockets.add(socket); + socket.setRawOption(RawSocketOption.fromInt( + RawSocketOption.levelIPv6, + RawSocketOption.IPv6MulticastInterface, + interface.index, + )); + } + // Join multicast on this interface. incoming.joinMulticast(_mDnsAddress!, interface); } @@ -148,9 +167,12 @@ class MDnsClient { } _incomingIPv4?.close(); - _incomingIPv6?.close(); _incomingIPv4 = null; - _incomingIPv6 = null; + + for (final RawDatagramSocket socket in _ipv6InterfaceSockets) { + socket.close(); + } + _ipv6InterfaceSockets.clear(); _resolver.clearPendingRequests(); diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 6affa172455..3cdf3facf8c 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -118,12 +118,13 @@ void main() { return datagramSocket; }); + const int numberOfFakeInterfaces = 10; Future> fakeNetworkInterfacesFactory( InternetAddressType type) async { final List fakeInterfaces = []; // Generate "fake" interfaces - for (int i = 0; i < 10; i++) { + for (int i = 0; i < numberOfFakeInterfaces; i++) { fakeInterfaces.add(FakeNetworkInterface( 'inetfake$i', [ @@ -144,7 +145,15 @@ void main() { mDnsPort: 1234, interfacesFactory: fakeNetworkInterfacesFactory); client.stop(); - expect(selectedInterfacesForSendingPackets.length, 1); + + if (testCase['datagramSocketType'] == InternetAddress.anyIPv4) { + expect(selectedInterfacesForSendingPackets.length, 1); + } else { + // + 1 because of unspecified address (::) + expect(selectedInterfacesForSendingPackets.length, + numberOfFakeInterfaces + 1); + } + expect(selectedInterfacesForSendingPackets[0], listenAddress.address); }); } @@ -181,6 +190,10 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { void joinMulticast(InternetAddress group, [NetworkInterface? interface]) { // nothing to do here } + @override + void setRawOption(RawSocketOption option) { + // nothing to do here + } } class FakeNetworkInterface implements NetworkInterface { From bc87c4ad829f71c478b199ff4db73bb099b9b267 Mon Sep 17 00:00:00 2001 From: MrJack <36191829+biagiopietro@users.noreply.github.com> Date: Sun, 16 Jun 2024 06:32:38 +0200 Subject: [PATCH 14/14] Updates --- packages/multicast_dns/lib/multicast_dns.dart | 13 +++++++++++-- packages/multicast_dns/test/client_test.dart | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index bbb94183525..d6e2e6b06c0 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -212,8 +212,17 @@ class MDnsClient { final Stream results = _resolver.addPendingRequest( query.resourceRecordType, query.fullyQualifiedName, timeout); - // Send and listen on same "ANY" interface - _incomingIPv4?.send(query.encode(), _mDnsAddress!, selectedMDnsPort); + final List packet = query.encode(); + + if (_mDnsAddress?.type == InternetAddressType.IPv4) { + // Send and listen on same "ANY" interface + _incomingIPv4?.send(packet, _mDnsAddress!, selectedMDnsPort); + } else { + for (final RawDatagramSocket socket in _ipv6InterfaceSockets) { + socket.send(packet, _mDnsAddress!, selectedMDnsPort); + } + } + return results; } diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 3cdf3facf8c..f3047e5deee 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -87,7 +87,7 @@ void main() { await client.lookup(ResourceRecordQuery.serverPointer('_')).toList(); }); - group('Bind a single socket to ANY IPv4/6', () { + group('Bind a single socket to ANY IPv4 and more than one when IPv6', () { final List> testCases = >[ { 'name': 'IPv4', @@ -140,6 +140,7 @@ void main() { final InternetAddress listenAddress = testCase['datagramSocketType']! as InternetAddress; + await client.start( listenAddress: listenAddress, mDnsPort: 1234, @@ -153,7 +154,6 @@ void main() { expect(selectedInterfacesForSendingPackets.length, numberOfFakeInterfaces + 1); } - expect(selectedInterfacesForSendingPackets[0], listenAddress.address); }); }