我試圖使用getaddrinfo()函數獲取我的本地(而不是外部)IP地址,但我看到提供的示例here,它們對於我的需求太複雜。還看到其他帖子,其中大多數真的想獲得外部IP,而不是本地IP。使用getaddrinfo()C函數獲取本地IP地址?
任何人都可以提供一個簡單的例子(或一個簡單的例子)有關如何獲得我自己的本地IP地址使用此功能的鏈接?
只是說清楚當我說本地,如果路由器是192.168.0.1
,我的本地IP地址可能是類似192.168.0.x
(只是一個例子)。
我試圖使用getaddrinfo()函數獲取我的本地(而不是外部)IP地址,但我看到提供的示例here,它們對於我的需求太複雜。還看到其他帖子,其中大多數真的想獲得外部IP,而不是本地IP。使用getaddrinfo()C函數獲取本地IP地址?
任何人都可以提供一個簡單的例子(或一個簡單的例子)有關如何獲得我自己的本地IP地址使用此功能的鏈接?
只是說清楚當我說本地,如果路由器是192.168.0.1
,我的本地IP地址可能是類似192.168.0.x
(只是一個例子)。
getaddrinfo()
不用於獲取您的本地IP地址 - 它用於查找名稱和/或服務到套接字地址。爲了獲得本地IP地址(ES),你想要的功能是getifaddrs()
- 這裏有一個小例子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <errno.h>
int main(int argc, char *argv[])
{
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
{
printf("%s: %s\n", ifa->ifa_name, buf);
}
}
freeifaddrs(myaddrs);
return 0;
}
感謝這個概念證明,我認爲它非常清楚。 – Goles 2010-01-29 09:46:45
這是我見過的最好的答案。 – xmllmx 2013-03-20 15:48:34
'getaddrinfo()'當然可以用來獲取本地IP地址。請參閱http://beej.us/guide/bgnet/output/html/multipage/syscalls.html#getaddrinfo。它也具有更便攜的好處 - 'getifaddrs()'大多侷限於Linux。 – patrickvacek 2014-03-21 14:18:17
傳遞主機名使用gethostname()
後,以gethostbyname()
int gethostname(char *hostname, size_t size);
不,主機名可能無法解析。試圖解決它是不好的。這是一個常見的編程錯誤,所以有些系統保證通過返回「127.0.1.1」來解析主機名,這樣就沒有錯誤。因此,你甚至不能依靠回報,因爲它可能不是一個有用的地址。 – 2013-08-23 15:51:09
的getaddrinfo是爲了有一個ipv4和ipv6之間的統一接口,這就是爲什麼它看起來有點複雜。 (如果得到答案,我會在稍後讓你知道) – Aif 2010-01-27 10:59:37
謝謝! ,是的,它看起來很複雜,我不想使用gethostbyname(),因爲它似乎被棄用... – Goles 2010-01-27 11:03:32
該頁面的最後一個例子是如何做到這一點...爲什麼這太複雜?如果你真的只需要一個IPv4地址,那麼使用AF_INET ......但是不要那樣做,也要支持IPv6。 – 2010-01-27 11:30:38