|
|
发表于 2005-4-29 21:50:21
|
显示全部楼层
怎么这么多人问这个问题?贴我的代码:
- #include <errno.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <net/if.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <string.h>
- inline static int __getifaddr_ipv4(int ifindex, const char *ifname,
- struct in_addr *ifaddr)
- {
- struct ifreq ifreq;
- int sockfd;
- int ret = -1;
- char ifn[IFNAMSIZ];
-
- if (ifindex > 0)
- {
- if (!(ifname = if_indextoname(ifindex, ifn)))
- {
- errno = ENXIO;
- return -1;
- }
- }
-
- if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0)
- {
- strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
- if ((ret = ioctl(sockfd, SIOCGIFADDR, &ifreq)) >= 0)
- *ifaddr = ((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr;
-
- close(sockfd);
- }
-
- return ret;
- }
-
- #ifdef IPV6
-
- #define PROC_IFINET6_PATH "/proc/net/if_inet6"
-
- inline static int __getifaddr_ipv6(unsigned int ifindex, const char *ifname,
- struct in6_addr *ifaddr)
- {
- FILE *fp = fopen(PROC_IFINET6_PATH, "r");
- char addrstr[INET6_ADDRSTRLEN];
- char seg[8][5];
- int index, plen, scope, flags;
- char ifn[IFNAMSIZ];
- int ret = -1;
-
- if (fp)
- {
- while (fscanf(fp, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %s\n"
- seg[0], seg[1], seg[2], seg[3], seg[4], seg[5], seg[6],
- seg[7], &index, &plen, &scope, &flags, ifn) != EOF)
- {
- if (ifindex == index || ifindex == 0 && strcmp(ifn, ifname) == 0)
- {
- sprintf(addrstr, "%s:%s:%s:%s:%s:%s:%s:%s", seg[0], seg[1],
- seg[2], seg[3], seg[4], seg[5], seg[6], seg[7]);
- ret = inet_pton(AF_INET6, addrstr, ifaddr);
- goto out;
- }
- }
-
- errno = ENXIO;
- out:
- fclose(fp);
- }
-
- return ret;
- }
-
- #endif
-
- int getifaddr(int family, unsigned int ifindex, const char *ifname,
- void *ifaddr)
- {
- switch (family)
- {
- case AF_INET:
- return __getifaddr_ipv4(ifindex, ifname, (struct in_addr *)ifaddr);
- #ifdef IPV6
- case AF_INET6:
- return __getifaddr_ipv6(ifindex, ifname, (struct in6_addr *)ifaddr);
- #endif
- default:
- errno = EAFNOSUPPORT;
- return -1;
- }
- }
-
复制代码
例如:
struct in_addr addr;
getifaddr(AF_INET, 0, "eth0", &addr);
如果ifindex不为0优先使用ifindex, 否则用ifname. |
|