On Tuesday, 4 February 2014 at 13:02:26 UTC, TheFlyingFiddle wrote:
I'm trying to find my own ip address using std.socket with little success. How would i go about doing this? (It should be a AddressFamily.INET socket)

On Windows, you can use the Win32`GetAdaptersInfo`[1] function to get a list of IPv4 adapters and addresses. If you need IPv6 addresses or other more modern features, there is the `GetAdaptersAddresses`[2] function, however it doesn't seem the necessary Windows headers (IPTypes.h / ifdef.h) have been ported to D for this yet.

[1] https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersinfo [2] https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses

As I attempt to post this, I now see this thread is... 10 years old. Oh well, still relevant I think.

```d
import std.string;
pragma(lib, `mingw/iphlpapi.lib`); // included with dmd

struct Adapter {
        string name;
        string desc;
        struct IPMask {
                string ip;
                string mask;
        }
        IPMask[] addresses;
}

Adapter[] getAdapters() {
        import core.sys.windows.windows;
        //import core.sys.windows.nspapi;
        import core.sys.windows.iptypes;
        import core.sys.windows.iphlpapi;

        void[] buf;
        uint size = 0;
        auto ret = GetAdaptersInfo(null, &size);
assert(ret == ERROR_BUFFER_OVERFLOW && size > 0, "Expected GetAdaptersInfo to return ERROR_BUFFER_OVERFLOW to query size of buffer");
        buf.length = size;
        ret = GetAdaptersInfo(cast(IP_ADAPTER_INFO*) buf.ptr, &size);
        assert(!ret, "GetAdaptersInfo error");

        auto adpt = cast(IP_ADAPTER_INFO*) buf.ptr;

        Adapter[] adapters;

        while (adpt) {
                scope(success) adpt = adpt.Next;

                Adapter adapter;
                adapter.name = adpt.AdapterName.fromStringz.idup;
                adapter.desc = adpt.Description.fromStringz.idup;

                IP_ADDR_STRING addr = adpt.IpAddressList;
                auto paddr = &addr;
                while (paddr) {
                        scope(success) paddr = addr.Next;
adapter.addresses ~= Adapter.IPMask(paddr.IpAddress.String.fromStringz.idup, paddr.IpMask.String.fromStringz.idup);
                }
                adapters ~= adapter;
        }
        return adapters;
}

void main() {
        import std.stdio;
        auto adapters = getAdapters();
        adapters.writeln;
}
```

Reply via email to