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); }
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); }
static extern unsafe int uv_getaddrinfo(IntPtr loopHandle, IntPtr handle, uv_getaddrinfo_cb cb, string node, string service, addrinfo *hints);
public static extern unsafe int getaddrinfo(string node, string service, addrinfo *hints, addrinfo **res);
public static extern unsafe void freeaddrinfo(addrinfo *res);