Ejemplo n.º 1
0
        public unsafe IPAddress[] getaddrinfo(string hostName)
        {
            void *pinput = null;

            addrinfo hint = new addrinfo();

            hint.ai_family = 0;
            hint.ai_flags  = 2;

            int result = getaddrinfo(hostName, null, (void *)(&hint), ref pinput);

            int count = 0;

            addrinfo *entry = (addrinfo *)pinput;

            while (entry != null)
            {
                if (entry->ai_family == 2 || entry->ai_family == 10)
                {
                    count++;
                }
                entry = (addrinfo *)entry->ai_next;
            }

            var addresses = new IPAddress[count];

            entry = (addrinfo *)pinput;
            count = 0;
            while (entry != null)
            {
                if (entry->ai_family == 2)
                {
                    addresses[count] = new IPAddress(new ReadOnlySpan <byte>(entry->ai_addr->data, 4));
                    count++;
                }
                else if (entry->ai_family == 10)
                {
                    addresses[count] = new IPAddress(new ReadOnlySpan <byte>(entry->ai_addr->data + 4, 16));
                    //addresses[count].ScopeId = entry->ifa_addr->scope_id;
                    count++;
                }

                entry = (addrinfo *)entry->ai_next;
            }

            freeifaddrs(pinput);

            return(addresses);
        }
Ejemplo n.º 2
0
        public Ipv4Address resolve(string host)
        {
            Debug.Assert(dispatcher != null);
            if (dispatcher.interrupted())
            {
                throw InterruptedException();
            }

            addrinfo hints = new addrinfo(0, AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, null, null, null);
            addrinfo addressInfos;
            int      result = getaddrinfo(host, null, hints, addressInfos);

            if (result != 0)
            {
                throw new System.Exception("Ipv4Resolver::resolve, getaddrinfo failed, " + errorMessage(result));
            }

            uint count = 0;

            for (addrinfo *addressInfo = addressInfos; addressInfo != null; addressInfo = addressInfo.ai_next)
            {
                ++count;
            }

            std::mt19937 generator   = new std::mt19937(std::random_device()());
            uint         index       = std::uniform_int_distribution <uint>(0, count - 1)(generator);
            addrinfo     addressInfo = addressInfos;

            for (uint i = 0; i < index; ++i)
            {
                addressInfo = addressInfo.ai_next;
            }

//C++ TO C# CONVERTER TODO TASK: There is no equivalent to 'reinterpret_cast' in C#:
            Ipv4Address address = new Ipv4Address(ntohl(reinterpret_cast <sockaddr_in>(addressInfo.ai_addr).sin_addr.s_addr));

            freeaddrinfo(addressInfo);
            return(address);
        }
Ejemplo n.º 3
0
 static extern unsafe int uv_getaddrinfo(IntPtr loopHandle, IntPtr handle, uv_getaddrinfo_cb cb, string node, string service, addrinfo *hints);
Ejemplo n.º 4
0
 public static extern unsafe int getaddrinfo(string node, string service, addrinfo *hints, addrinfo **res);
Ejemplo n.º 5
0
 public static extern unsafe void freeaddrinfo(addrinfo *res);