The function is as follow:
BOOL getLocalIP(CString &cstrIP)
{
char strHostname[MAX_PATH] = {0};
hostent* pHost = NULL;
if (SOCKET_ERROR == gethostname(strHostname, sizeof(strHostname)))
return FALSE;
if (NULL == (pHost = gethostbyname(strHostname)))
return FALSE;
cstrIP = inet_ntoa(*(in_addr*)pHost->h_addr_list[0]);
return !cstrIP.IsEmpty();
}
Remarks:
inet_ntoa():
· The string returned by inet_ntoa() resides in the memory allocate by windows sockets, we don’t need to free the string.
· The string is guaranteed to be valid until the next Windows Sockets function call within the same thread—but no longer. Therefore, the data should be copied immediately.
hostent:
struct hostent {
char FAR * h_name; /* official name of host */
char FAR * FAR * h_aliases; /* alias list */
short h_addrtype; /* host address type */
short h_length; /* length of address */
char FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr h_addr_list[0] /* address, for backward compat */
};
Notes: #define doesn’t limited to spacename.
And the structure returned by gethostbyname shouldn’t be changed.