2009-10-15 139 views
2

如何使用C代碼獲取本地計算機的IP地址?獲取IP地址的C代碼

如果有多個接口,那麼我應該能夠顯示每個接口的IP地址。

注意:不要使用任何命令如ifconfig在C代碼中檢索IP地址。

+2

家庭作業?你到目前爲止有什麼? – GManNickG 2009-10-15 05:54:14

+0

您必須注意,在使用'ifconfig'的生產代碼中不是最糟糕的解決方案。 – 2009-10-15 06:15:34

+0

不要擔心這不是我的家庭作業難題....我越來越多地參與到一些在C中的嚴重編程,結果試圖修復我的應用程序中的一些缺失的鏈接.... – codingfreak 2009-10-15 07:22:13

回答

3

Michael Foukarakis我能夠顯示各種接口在同一臺機器上的IP地址輸入:

#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <ifaddrs.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int 
main(int argc, char *argv[]) 
{ 
    struct ifaddrs *ifaddr, *ifa; 
    int family, s; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { 
     family = ifa->ifa_addr->sa_family; 

     if (family == AF_INET) { 
      s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), 
              host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 
      if (s != 0) { 
       printf("getnameinfo() failed: %s\n", gai_strerror(s)); 
       exit(EXIT_FAILURE); 
      } 
      printf("<Interface>: %s \t <Address> %s\n", ifa->ifa_name, host); 
     } 
    } 
    return 0; 
} 
10
#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <netinet/in.h> 
#include <net/if.h> 

int main() 
{ 
    int fd; 
    struct ifreq ifr; 

    fd = socket(AF_INET, SOCK_DGRAM, 0); 

    ifr.ifr_addr.sa_family = AF_INET; 

    snprintf(ifr.ifr_name, IFNAMSIZ, "eth0"); 

    ioctl(fd, SIOCGIFADDR, &ifr); 

    /* and more importantly */ 
    printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 

    close(fd); 
} 

如果要列舉所有的接口,看看在getifaddrs()功能 - 如果你是在Linux上。

-1

獲取「/ proc/net/dev」中的所有接口。注意:它不能僅使用ioctl獲取所有接口。

#define PROC_NETDEV "/proc/net/dev" 

fp = fopen(PROC_NETDEV, "r"); 
while (NULL != fgets(buf, sizeof buf, fp)) { 
    s = strchr(buf, ':'); 
    *s = '\0'; 
    s = buf; 

    // Filter all space ' ' here 
    got one interface name here, continue for others 
} 
fclose(fp); 

然後獲得使用地址的ioctl():

struct ifreq ifr; 
struct ifreq ifr_copy; 
struct sockaddr_in *sin; 

for each interface name { 
    strncpy(ifr.ifr_name, ifi->name, sizeof(ifr.ifr_name) - 1); 
    ifr_copy = ifr; 
    ioctl(fd, SIOCGIFFLAGS, &ifr_copy); 
    ifi->flags = ifr_copy.ifr_flags; 
    ioctl(fd, SIOCGIFADDR, &ifr_copy); 
    sin = (struct sockaddr_in*)&ifr_copy.ifr_addr; 
    ifi->addr = allocating address memory here 
    bzero(ifi->addr, sizeof *ifi->addr); 
    *(struct sockaddr_in*)ifi->addr = *sin; 

    /* Here also you could get netmask and hwaddr. */ 
} 
+0

看到其他職位如何打開「fd」 – Test 2009-10-15 06:07:35