[erlang-questions] : : Finding IP addresses in a PC

David Hopwood <>
Wed Oct 4 17:54:11 CEST 2006

Raimo Niskanen wrote:
> I was thinking more in the line of using inet_ntoa() and inet_addr(),
> or rather use ntohl() and htonl() around the current fmt_addr(),
> or even rewrite fmt_addr to take a char[] as input, in
> network byte order.
> Rewriting fmt_addr() as you suggested works on little-endian
> machines such as Intel, and there are not many big-endian
> Windows platforms out there, but I think it is
> a confusing and wrong(tm) way to do it.

If you use GetAdaptersInfo, the string formatting is done for you in
the IpAddress.String field:

  DWORD len = 0;
  if (GetAdaptersInfo(&dummy, &len) != ERROR_BUFFER_OVERFLOW || len == 0) {
      return FAILED;

  IP_ADAPTER_INFO pAdapters = (IP_ADAPTER_INFO *) malloc(len);
  if (pAdapters == NULL) {
      return FAILED;

  DWORD err = GetAdaptersInfo(pAdapters, &len);
  if (err != ERROR_SUCCESS) {
      return FAILED;

  do {
      IP_ADDR_STRING *pip = &pAdapters->IpAddressList;
      while (pip != NULL) {
          pip = pip->Next;
      pAdapters = pAdapters->Next;
  } while (pAdapters != NULL);

I wrote:
> Note that this API has some limitations (no IPv6 support, only one address
> returned per adapter)

Correction: it can return multiple addresses for each adapter, as shown above.
GetAdaptersAddresses is only needed for IPv6.

David Hopwood <>

More information about the erlang-questions mailing list