获取本机Ip信息
方式一
#include <netdb.h>
#include <unistd.h>
#include <net/if.h>
#include <ifaddrs.h>
bool GetHostInfo(std::string& hostName, std::string& Ip) {
char name[256];
gethostname(name, sizeof(name));
hostName = name;
struct hostent* host = gethostbyname(name);
char ipStr[32];
const char* ret = inet_ntop(host->h_addrtype, host->h_addr_list[0], ipStr, sizeof(ipStr));
if (NULL == ret) {
std::cout << "hostname transform to ip failed";
return false;
}
Ip = ipStr;
return true;
}
方式二:
#include <netdb.h>
#include <unistd.h>
#include <net/if.h>
#include <ifaddrs.h>
int GetAddrInfo() {
struct ifaddrs* myaddrs, * ifa;
void* in_addr;
char buf[64];
if (getifaddrs(&myaddrs) != 0)
{
perror("getifaddrs");
exit(1);
}
for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
continue;
if (!(ifa->ifa_flags & IFF_UP))
continue;
switch (ifa->ifa_addr->sa_family)
{
case AF_INET:
{
struct sockaddr_in* s4 = (struct sockaddr_in*)ifa->ifa_addr;
in_addr = &s4->sin_addr;
break;
}
case AF_INET6:
{
struct sockaddr_in6* s6 = (struct sockaddr_in6*)ifa->ifa_addr;
in_addr = &s6->sin6_addr;
break;
}
default:
continue;
}
if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
{
printf("%s: inet_ntop failed!\n", ifa->ifa_name);
}
else
{
if (strcmp(ifa->ifa_name, "ens33"))
printf("%s: %s\n", ifa->ifa_name, buf);
}
}
freeifaddrs(myaddrs);
return 0;
}