Skip to content

Commit

Permalink
for mac
Browse files Browse the repository at this point in the history
  • Loading branch information
ikpil committed Sep 24, 2024
1 parent 5b977c8 commit 4def763
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 19 deletions.
50 changes: 36 additions & 14 deletions test/UniNetty.Transport.Tests/Channel/Sockets/NetUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ namespace UniNetty.Transport.Tests.Channel.Sockets
public static class NetUtil
{
public static readonly IPAddress MULTICAST_IPV4 = IPAddress.Parse("230.0.0.1");
public static readonly IPAddress MULTICAST_IPV6_LINKLOCAL = IPAddress.Parse("FF02::1");
public static readonly IPAddress MULTICAST_IPV6_SITELOCAL = IPAddress.Parse("FF05::1");
public static readonly IPAddress MULTICAST_IPV6_INTERFACE_LOCAL = IPAddress.Parse("FF01::1");

internal static readonly AddressFamily[] AddressFamilyTypes =
{
Expand All @@ -38,16 +37,9 @@ public static bool IsSupport(AddressFamily addressFamily)
if (ni.OperationalStatus != OperationalStatus.Up)
continue;

var unicastAddresses = ni.GetIPProperties().UnicastAddresses;

foreach (var ip in unicastAddresses)
var ipProp = ni.GetIPProperties();
foreach (var ip in ipProp.UnicastAddresses)
{
// pass link-local
if (AddressFamily.InterNetworkV6 == addressFamily && ip.Address.IsIPv6LinkLocal)
{
continue;
}

if (ip.Address.AddressFamily == addressFamily)
{
return true; // 지원됨
Expand All @@ -72,23 +64,53 @@ public static IPAddress GetLoopbackAddress(AddressFamily addressFamily)

throw new NotSupportedException($"Address family {addressFamily} is not supported. Expecting InterNetwork/InterNetworkV6");
}

public static NetworkInterface LoopbackInterface(AddressFamily addressFamily)
{
var nis = NetworkInterface.GetAllNetworkInterfaces();
foreach (var ni in nis)
{
if (ni.OperationalStatus != OperationalStatus.Up)
continue;

public static NetworkInterface MulticastInterface(AddressFamily addressFamily)
if (ni.NetworkInterfaceType != NetworkInterfaceType.Loopback)
continue;

var ipProps = ni.GetIPProperties();
foreach (var multicast in ipProps.UnicastAddresses)
{
if (multicast.Address.AddressFamily == addressFamily)
{
return ni;
}
}
}

throw new NotSupportedException($"Address family {addressFamily} is not supported. Expecting InterNetwork/InterNetworkV6");
}


public static NetworkInterface SupportsMulticastInterface(AddressFamily addressFamily)
{
var nis = NetworkInterface.GetAllNetworkInterfaces();
foreach (var ni in nis)
{
if (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback)
continue;

if (!ni.SupportsMulticast)
continue;

if (ni.OperationalStatus != OperationalStatus.Up)
continue;

var ipProps = ni.GetIPProperties();
if (0 >= ipProps.UnicastAddresses.Count)
continue;

foreach (var unicast in ipProps.UnicastAddresses)
foreach (var multicast in ipProps.UnicastAddresses)
{
if (unicast.Address.AddressFamily == addressFamily)
if (multicast.Address.AddressFamily == addressFamily)
{
return ni;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Copyright (c) Ikpil Choi [email protected] All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.Linq;

namespace UniNetty.Transport.Tests.Channel.Sockets
{
using System;
Expand Down Expand Up @@ -106,6 +108,7 @@ public void Multicast(AddressFamily addressFamily, IByteBufferAllocator allocato
var serverGroup = new MultithreadEventLoopGroup(1);
var clientGroup = new MultithreadEventLoopGroup(1);

var supportsMulticast = NetUtil.SupportsMulticastInterface(addressFamily);
try
{
var multicastHandler = new MulticastTestHandler();
Expand All @@ -121,9 +124,11 @@ public void Multicast(AddressFamily addressFamily, IByteBufferAllocator allocato
channel.Pipeline.AddLast(nameof(SocketDatagramChannelMulticastTest), multicastHandler);
}));

IPAddress address = addressFamily == AddressFamily.InterNetwork
? IPAddress.Any
: IPAddress.IPv6Any;
var address = supportsMulticast
.GetIPProperties()
.UnicastAddresses
.First(x => x.Address.AddressFamily == addressFamily)
.Address;

this.Output.WriteLine($"Multicast server binding to:({addressFamily}){address}");
Task<IChannel> task = serverBootstrap.BindAsync(address, IPEndPoint.MinPort);
Expand Down Expand Up @@ -155,8 +160,8 @@ public void Multicast(AddressFamily addressFamily, IByteBufferAllocator allocato

IPAddress multicastAddress = addressFamily == AddressFamily.InterNetwork
? NetUtil.MULTICAST_IPV4
: NetUtil.MULTICAST_IPV6_SITELOCAL;
: NetUtil.MULTICAST_IPV6_INTERFACE_LOCAL;

var groupAddress = new IPEndPoint(multicastAddress, serverEndPoint.Port);
Task joinTask = serverChannel.JoinGroup(groupAddress);
Assert.True(joinTask.Wait(TimeSpan.FromMilliseconds(DefaultTimeOutInMilliseconds * 5)),
Expand Down

0 comments on commit 4def763

Please sign in to comment.