关于getifaddrs()和struct ifaddrs的说明
来源:互联网 发布:我们台湾这些年 知乎 编辑:程序博客网 时间:2024/05/29 05:12
1,关于struct ifaddrs的说明:
struct ifaddrs
{
struct ifaddrs *ifa_next; /* Next item in list */
char *ifa_name; /* Name of interface */
unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */
struct sockaddr *ifa_addr; /* Address of interface */
struct sockaddr *ifa_netmask; /* Netmask of interface */
union
{
struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */
struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */
} ifa_ifu;
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void *ifa_data; /* Address-specific data */
};
2,关于getifaddrs()
The getifaddrs() function creates a linked list of structures describing the network interfaces of the local system, and stores the address of the first
item of the list in *ifap.
The list consists of ifaddrs structures, defined as follows:
The ifa_next field contains a pointer to the next structure on the list, or
NULL if this is the last item of the list.
The ifa_name points to the null-terminated interface name.
The ifa_flags field contains the interface flags
The ifa_addr field points to a structure containing the interface address.
The ifa_netmask field points to a structure containing the netmask associated with ifa_addr, if applicable for the address family.
Depending on whether the bit IFF_BROADCAST or IFF_POINTOPOINT is set in ifa_flags (only one can be set at a time), either ifa_broadaddr will contain the broadcast address associated with ifa_addr (if applicable for the address family) or ifa_dstaddr will contain the destination address of the point-to-point interface.
The ifa_data field points to a buffer containing address-family-specific data;this field may be NULL if there is no such data for this interface.
返回值:
On success, getifaddrs() returns zero; on error, -1 is returned, and errno is set appropriately.
3,注意:
The data returned by getifaddrs() is dynamically allocated and should be freed using freeifaddrs() when no longer needed.
输出:
$ ./a.out
lo address family: 17 (AF_PACKET)
eth0 address family: 17 (AF_PACKET)
lo address family: 2 (AF_INET)
address: <127.0.0.1>
eth0 address family: 2 (AF_INET)
address: <10.1.1.4>
lo address family: 10 (AF_INET6)
address: <::1>
eth0 address family: 10 (AF_INET6)
address: <fe80::2d0:59ff:feda:eb51%eth0
struct ifaddrs
{
struct ifaddrs *ifa_next; /* Next item in list */
char *ifa_name; /* Name of interface */
unsigned int ifa_flags; /* Flags from SIOCGIFFLAGS */
struct sockaddr *ifa_addr; /* Address of interface */
struct sockaddr *ifa_netmask; /* Netmask of interface */
union
{
struct sockaddr *ifu_broadaddr; /* Broadcast address of interface */
struct sockaddr *ifu_dstaddr; /* Point-to-point destination address */
} ifa_ifu;
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void *ifa_data; /* Address-specific data */
};
2,关于getifaddrs()
The getifaddrs() function creates a linked list of structures describing the network interfaces of the local system, and stores the address of the first
item of the list in *ifap.
The list consists of ifaddrs structures, defined as follows:
The ifa_next field contains a pointer to the next structure on the list, or
NULL if this is the last item of the list.
The ifa_name points to the null-terminated interface name.
The ifa_flags field contains the interface flags
The ifa_addr field points to a structure containing the interface address.
The ifa_netmask field points to a structure containing the netmask associated with ifa_addr, if applicable for the address family.
Depending on whether the bit IFF_BROADCAST or IFF_POINTOPOINT is set in ifa_flags (only one can be set at a time), either ifa_broadaddr will contain the broadcast address associated with ifa_addr (if applicable for the address family) or ifa_dstaddr will contain the destination address of the point-to-point interface.
The ifa_data field points to a buffer containing address-family-specific data;this field may be NULL if there is no such data for this interface.
返回值:
On success, getifaddrs() returns zero; on error, -1 is returned, and errno is set appropriately.
3,注意:
The data returned by getifaddrs() is dynamically allocated and should be freed using freeifaddrs() when no longer needed.
4,一个小例子:
#include <arpa/inet.h>#include <sys/socket.h>#include <netdb.h>#include <ifaddrs.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>intmain(int argc, char *argv[]){ struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); exit(EXIT_FAILURE); } /* Walk through linked list, maintaining head pointer so we can free list later */ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; /* Display interface name and family (including symbolic form of the latter for the common families) */ printf("%s address family: %d%s\n", ifa->ifa_name, family, (family == AF_PACKET) ? " (AF_PACKET)" : (family == AF_INET) ? " (AF_INET)" : (family == AF_INET6) ? " (AF_INET6)" : ""); /* For an AF_INET* interface address, display the address */ if (family == AF_INET || family == AF_INET6) { s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { printf("getnameinfo() failed: %s\n", gai_strerror(s)); exit(EXIT_FAILURE); } printf("\taddress: <%s>\n", host); } } freeifaddrs(ifaddr); //一定要释放 exit(EXIT_SUCCESS);}
输出:
引用
$ ./a.out
lo address family: 17 (AF_PACKET)
eth0 address family: 17 (AF_PACKET)
lo address family: 2 (AF_INET)
address: <127.0.0.1>
eth0 address family: 2 (AF_INET)
address: <10.1.1.4>
lo address family: 10 (AF_INET6)
address: <::1>
eth0 address family: 10 (AF_INET6)
address: <fe80::2d0:59ff:feda:eb51%eth0
- 关于getifaddrs()和struct ifaddrs的说明
- 关于getifaddrs()和struct ifaddrs的说明
- 关于getifaddrs()和struct ifaddrs的说明
- getifaddrs()和struct ifaddrs的使用,获取本机IP
- getifaddrs()和struct ifaddrs的使用,获取本机IP
- getifaddrs()和struct ifaddrs的使用,获取本机IP
- Linxu的struct ifaddrs 与getifaddrs()函数
- 关于struct的初始化的说明
- struct 和 typedef struct 的说明和注意事项。
- 关于 typedef struct 和 struct
- 关于 typedef struct 和 struct
- 关于 typedef struct 和 struct
- 愚蠢的问题关于struct和typedef struct
- 关于union和struct的内存分配
- 关于class和struct的区别
- 关于union和struct的内存分配
- 关于union和struct的内存分配
- 关于struct和class的区别
- 代码混淆
- 如何对待上司的弱项(或缺点)
- 新闻网站如何赚钱?来看看BuzzFeed和Dish
- linux库文件头文件查找顺序
- C语言中史上最愚蠢的Bug
- 关于getifaddrs()和struct ifaddrs的说明
- android系统action大全
- 基于Socket的Android手机视频实时传输
- getSystemService
- php中 ini_set的用法
- eclipse 自动注释,加上author、日期等信息
- Ubuntu下面安装eclipse for c++
- .net区分中英文截取字符串
- 机会只留给有准备的人