获取LAN ip并打印它

时间:2011-01-11 10:53:25

标签: c linux network-programming

有谁知道如何获取我的LAN IP并将其打印在屏幕上。 *我不是指shell,而是c编程。 **如果您给我发贴示例代码,我将不胜感激。

3 个答案:

答案 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。