< Summary

Information
Line coverage
0%
Covered lines: 0
Uncovered lines: 12
Coverable lines: 12
Total lines: 94
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
GetIPAddress(...)0%880%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/Common/src/System/Net/IPEndPointExtensions.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Diagnostics;
 5using System.Net;
 6
 7namespace System.Net.Sockets
 8{
 9    internal static partial class IPEndPointExtensions
 10    {
 11        public static unsafe IPAddress GetIPAddress(ReadOnlySpan<byte> socketAddressBuffer)
 012        {
 013            AddressFamily family = SocketAddressPal.GetAddressFamily(socketAddressBuffer);
 14
 015            if (family == AddressFamily.InterNetworkV6)
 016            {
 017                Span<byte> address = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
 18                uint scope;
 019                SocketAddressPal.GetIPv6Address(socketAddressBuffer, address, out scope);
 20
 21                // Clear scope if set for anything but Link Local address (always starts with fe80 first 10bits).
 022                return new IPAddress(address, (address[0] == 0xFE && (address[1] & 0xC0) == 0x80) ? (long)scope : 0);
 23            }
 024            else if (family == AddressFamily.InterNetwork)
 025            {
 026                return new IPAddress((long)SocketAddressPal.GetIPv4Address(socketAddressBuffer) & 0x0FFFFFFFF);
 27            }
 28
 029            throw new SocketException((int)SocketError.AddressFamilyNotSupported);
 030        }
 31
 32        public static unsafe void SetIPAddress(Span<byte> socketAddressBuffer, IPAddress address)
 33        {
 34            SocketAddressPal.SetAddressFamily(socketAddressBuffer, address.AddressFamily);
 35            SocketAddressPal.SetPort(socketAddressBuffer, 0);
 36            if (address.AddressFamily == AddressFamily.InterNetwork)
 37            {
 38#pragma warning disable CS0618
 39                SocketAddressPal.SetIPv4Address(socketAddressBuffer, (uint)address.Address);
 40#pragma warning restore CS0618
 41            }
 42            else
 43            {
 44                Span<byte> addressBuffer = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
 45                address.TryWriteBytes(addressBuffer, out int written);
 46                Debug.Assert(written == IPAddressParserStatics.IPv6AddressBytes);
 47                SocketAddressPal.SetIPv6Address(socketAddressBuffer, addressBuffer, (uint)address.ScopeId);
 48            }
 49        }
 50
 51        public static IPEndPoint CreateIPEndPoint(ReadOnlySpan<byte> socketAddressBuffer)
 52        {
 53            return new IPEndPoint(GetIPAddress(socketAddressBuffer), SocketAddressPal.GetPort(socketAddressBuffer));
 54        }
 55
 56        // suggestion from https://github.com/dotnet/runtime/issues/78993
 57        public static void Serialize(this IPEndPoint endPoint, Span<byte> destination)
 58        {
 59            SocketAddressPal.SetAddressFamily(destination, endPoint.AddressFamily);
 60            SetIPAddress(destination, endPoint.Address);
 61            SocketAddressPal.SetPort(destination, (ushort)endPoint.Port);
 62        }
 63
 64        public static unsafe bool Equals(this IPEndPoint endPoint, ReadOnlySpan<byte> socketAddressBuffer)
 65        {
 66            if (socketAddressBuffer.Length >= SocketAddress.GetMaximumAddressSize(endPoint.AddressFamily) &&
 67                endPoint.AddressFamily == SocketAddressPal.GetAddressFamily(socketAddressBuffer) &&
 68                endPoint.Port == (int)SocketAddressPal.GetPort(socketAddressBuffer))
 69            {
 70                if (endPoint.AddressFamily == AddressFamily.InterNetwork)
 71                {
 72#pragma warning disable CS0618
 73                    return endPoint.Address.Address == (long)SocketAddressPal.GetIPv4Address(socketAddressBuffer);
 74#pragma warning restore CS0618
 75                }
 76                else
 77                {
 78                    Span<byte> addressBuffer1 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
 79                    Span<byte> addressBuffer2 = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes];
 80                    SocketAddressPal.GetIPv6Address(socketAddressBuffer, addressBuffer1, out uint scopeid);
 81                    if (endPoint.Address.ScopeId != (long)scopeid)
 82                    {
 83                        return false;
 84                    }
 85                    endPoint.Address.TryWriteBytes(addressBuffer2, out _);
 86                    return addressBuffer1.SequenceEqual(addressBuffer2);
 87                }
 88            }
 89
 90            return false;
 91        }
 92    }
 93}
 94