[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:

  IP_ADAPTER_INFO dummy;
  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) {
          add_address(pip->IpAddress.String);
          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