有谁知道如何获取我的LAN IP并将其打印在屏幕上。 *我不是指shell,而是c编程。 **如果您给我发贴示例代码,我将不胜感激。
答案 0 :(得分:4)
有几种方法;首先,您可以使用connect(2)
建立与已知对等方的连接,然后使用getsockname(2)
读取本地套接字“name”。这是一个非常糟糕的机制,但很容易。
但是,getsockname(2)
只报告一个 IP地址,当一台机器可能有数千个IP地址,并且返回的IP将部分取决于您选择的同行!所以,不太可靠。
更好的答案是使用rtnetlink(7)
直接从内核读取机器的IP地址:您将为机器上的每个接口向内核发送RTM_GETADDR
消息并阅读答案背部。理解如何使用它的最佳选择可能是阅读ip
程序的源代码。
另一种选择是在IP套接字上使用SIOCGIFCONF
ioctl(2)
。这个界面不像rtnetlink(7)
界面那么灵活,所以它可能并不总是正确的,但它将是一个中间点。 ifconfig(8)
实用程序使用此方法显示ifconfig -a
输出。再次,你最好的选择是阅读来源。 (ioctl_list(2)
中有一些细微的文档。)
答案 1 :(得分:3)
来自getifaddrs()
的{{1}}函数是获取当前接口和相应地址的最简单方法:
<ifaddrs.h>
答案 2 :(得分:2)
gethostbyname
可以帮助您完成此操作。例如:
GetLocalAddress()
{
char ac[80];
// Get my host name
if (gethostname(ac, sizeof(ac)) != -1)
{
printf("Host name: %s\n", ac);
// Find IP addresses
struct hostent* p_he = gethostbyname(ac);
if (p_he != 0)
{
for (int i=0; p_he->h_addr_list[i] != 0; ++i)
{
struct in_addr addr;
memcpy(&addr, p_he->h_addr_list[i], sizeof(struct in_addr));
printf("IP address %d: %s\n", i, inet_ntoa(addr));
}
}
}
您可能希望过滤以从列表中删除127.0.0.1。