2011-01-11 54 views
1

有谁知道我如何获得我的局域网IP并将其打印在屏幕上。 *我不是指shell,而是c编程。 **我会很感激,如果你会张贴我的示例代码。获取局域网ip并打印它

回答

3

<ifaddrs.h>getifaddrs()功能是获取当前的接口和相应的地址,最简单的方法:

#include <stdio.h> 
#include <ifaddrs.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

int main() 
{ 
    struct ifaddrs *iflist, *iface; 

    if (getifaddrs(&iflist) < 0) { 
     perror("getifaddrs"); 
     return 1; 
    } 

    for (iface = iflist; iface; iface = iface->ifa_next) { 
     int af = iface->ifa_addr->sa_family; 
     const void *addr; 
     char addrp[INET6_ADDRSTRLEN]; 

     switch (af) { 
      case AF_INET: 
       addr = &((struct sockaddr_in *)iface->ifa_addr)->sin_addr; 
       break; 
      case AF_INET6: 
       addr = &((struct sockaddr_in6 *)iface->ifa_addr)->sin6_addr; 
       break; 
      default: 
       addr = NULL; 
     } 

     if (addr) { 
      if (inet_ntop(af, addr, addrp, sizeof addrp) == NULL) { 
       perror("inet_ntop"); 
       continue; 
      } 

      printf("Interface %s has address %s\n", iface->ifa_name, addrp); 
     } 
    } 

    freeifaddrs(iflist); 
    return 0; 
} 
4

有几种方法;首先,您可以使用connect(2)建立与已知对等方的连接,然后使用getsockname(2)读取本地套接字“名称”。这是一个相当差的机制,但它很容易。

但是,getsockname(2)将只报告一个 IP地址,当一台机器可能有上千个IP地址,并返回IP在您选择的节点将部分取决于!所以,不是很可靠。

一个更好的答案是使用rtnetlink(7)直接从内核读取机器的IP地址:您将发送RTM_GETADDR消息到机器上每个接口的内核并读取答案。理解如何使用这个最好的选择可能是读取ip程序的源代码。

另一种选择是在IP套接字上使用SIOCGIFCONFioctl(2)。该接口不如rtnetlink(7)接口灵活,所以它可能并不总是正确的,但它将是一个中间点。 ifconfig(8)实用程序使用此方法来显示ifconfig -a输出。再次,你最好的选择将是阅读来源。 (在ioctl_list(2)有一些轻微的文档。)

+0

感谢..你知道我在哪里可以找到示例代码..? – azulay7 2011-01-11 11:27:37

+0

`getifaddrs()`是一个更易于使用的界面(它使用下面的netlink)。 – caf 2011-01-12 09:30:40

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。

+1

我不认为'C编程'有`std :: cout` ;-) – Johnsyweb 2011-01-11 11:56:11