Following @Remy Lebeau answer, I wrote a function that returns the current address of the machine. I tested this only on macOS High Sierra.
interfaec can be any of lo0 , en0 , etc.
ipVersion can be AF_INET or AF_INET6 .
long int getInternalAddress(char* interface, sa_family_t ipVersion) { struct ifaddrs *ifaddrHead, *ifaddr; sa_family_t family; int n; char *interfaceName; if (getifaddrs(&ifaddrHead) != 0) { fprintf(stderr, "ifaddrs error"); } for (ifaddr = ifaddrHead, n = 0; ifaddr != NULL; ifaddr = ifaddr->ifa_next, n++) { family = ifaddr->ifa_addr->sa_family; interfaceName = ifaddr->ifa_name; if (!family || family != ipVersion || strcmp(interfaceName, interface)) continue; struct sockaddr *addr = ifaddr->ifa_addr; struct sockaddr_in* addr_in = (struct sockaddr_in*) addr; long int address = addr_in->sin_addr.s_addr; freeifaddrs(ifaddrHead); return address; } freeifaddrs(ifaddrHead); return 0; }
To use it,
int main() { long int address = getInternalAddress((char*) &"en0", AF_INET); printf("%li\n", address); return 0; }
I'm still new to C, if something is wrong please tell me.
Yuan fu
source share