public override unsafe IPEndPoint[] GetActiveUdpListeners()
        {
            int realCount = Interop.Sys.GetEstimatedUdpListenerCount();
            int infoCount = realCount * 2;

            Interop.Sys.IPEndPointInfo[] infos = new Interop.Sys.IPEndPointInfo[infoCount];
            fixed(Interop.Sys.IPEndPointInfo *infosPtr = infos)
            {
                if (Interop.Sys.GetActiveUdpListeners(infosPtr, &infoCount) == -1)
                {
                    throw new NetworkInformationException(SR.net_PInvokeError);
                }
            }

            IPEndPoint[] endPoints = new IPEndPoint[infoCount];
            for (int i = 0; i < infoCount; i++)
            {
                Interop.Sys.IPEndPointInfo endPointInfo = infos[i];
                int       port      = (int)endPointInfo.Port;
                IPAddress ipAddress = endPointInfo.NumAddressBytes == 0 ?
                                      IPAddress.Any :
                                      new IPAddress(new ReadOnlySpan <byte>(endPointInfo.AddressBytes, checked ((int)endPointInfo.NumAddressBytes)));

                endPoints[i] = new IPEndPoint(ipAddress, port);
            }

            return(endPoints);
        }
        public unsafe override IPEndPoint[] GetActiveUdpListeners()
        {
            int realCount = Interop.Sys.GetEstimatedUdpListenerCount();
            int infoCount = realCount * 2;

            Interop.Sys.IPEndPointInfo[] infos = new Interop.Sys.IPEndPointInfo[infoCount];
            fixed(Interop.Sys.IPEndPointInfo *infosPtr = infos)
            {
                if (Interop.Sys.GetActiveUdpListeners(infosPtr, &infoCount) == -1)
                {
                    throw new NetworkInformationException(SR.net_PInvokeError);
                }
            }

            IPEndPoint[] endPoints = new IPEndPoint[infoCount];
            for (int i = 0; i < infoCount; i++)
            {
                Interop.Sys.IPEndPointInfo endPointInfo = infos[i];
                int       port = (int)endPointInfo.Port;
                IPAddress ipAddress;
                if (endPointInfo.NumAddressBytes == 0)
                {
                    ipAddress = IPAddress.Any;
                }
                else
                {
                    byte[] bytes = new byte[endPointInfo.NumAddressBytes];
                    fixed(byte *bytesPtr = &bytes[0])
                    {
                        Buffer.MemoryCopy(endPointInfo.AddressBytes, bytesPtr, bytes.Length, bytes.Length);
                    }

                    ipAddress = new IPAddress(bytes);
                }

                endPoints[i] = new IPEndPoint(ipAddress, port);
            }

            return(endPoints);
        }
Example #3
0
        public unsafe override IPEndPoint[] GetActiveUdpListeners()
        {
            int realCount = Interop.Sys.GetEstimatedUdpListenerCount();
            int infoCount = (int)(realCount * 1.5f);

            Interop.Sys.IPEndPointInfo *infos = stackalloc Interop.Sys.IPEndPointInfo[infoCount];
            while (Interop.Sys.GetActiveUdpListeners(infos, &infoCount) == -1)
            {
                var newAlloc = stackalloc Interop.Sys.IPEndPointInfo[infoCount];
                infos = newAlloc;
            }

            IPEndPoint[] endPoints = new IPEndPoint[infoCount];
            for (int i = 0; i < infoCount; i++)
            {
                Interop.Sys.IPEndPointInfo endPointInfo = infos[i];
                int       port = (int)endPointInfo.Port;
                IPAddress ipAddress;
                if (endPointInfo.NumAddressBytes == 0)
                {
                    ipAddress = IPAddress.Any;
                }
                else
                {
                    byte[] bytes = new byte[endPointInfo.NumAddressBytes];
                    fixed(byte *bytesPtr = bytes)
                    {
                        Buffer.MemoryCopy(endPointInfo.AddressBytes, bytesPtr, bytes.Length, bytes.Length);
                    }

                    ipAddress = new IPAddress(bytes);
                }

                endPoints[i] = new IPEndPoint(ipAddress, port);
            }

            return(endPoints);
        }