2024年2月20日发(作者:)

#ifndef IFNAMSIZ

#define IFNAMSIZ 16

#endif char ifr_name[IFNAMSIZ];

union {

struct sockaddr ifru_addr;

struct sockaddr ifru_dstaddr;

struct sockaddr ifru_broadaddr;

__ulong32_t ifru_flags;

int ifru_metric;

caddr_t ifru_data;

u_short ifru_site6;

__ulong32_t ifru_mtu;

int ifru_baudrate;

} ifr_ifru;

Following macros are provided for convenience

#define ifr_addr ifr__addr /* address */

#define ifr_dstaddr ifr__dstaddr /* other end of p-to-p link */

#define ifr_broadaddr ifr__broadaddr /* broadcast address */

#define ifr_flags ifr__flags /* flags */

#define ifr_metric ifr__metric /* metric */

#define ifr_data ifr__data /* for use by interface */

#define ifr_site6 ifr__site6 /* IPv6 site index */

#define ifr_mtu ifr__mtu /* mtu of interface */

#define ifr_isno ifr__data /* pointer to if_netopts */

#define ifr_baudrate ifr__baudrate /* baudrate of interface */

};/*

* Structure used in SIOCGIFCONF request.

* Used to retrieve interface configuration

* for machine (useful for programs which

* must know all networks accessible). */

struct ifconf {

int ifc_len; /* size of associated buffer */

union {

caddr_t ifcu_buf;

struct ifreq *ifcu_req;

} ifc_ifcu; Following macros are provided for convenience

#define ifc_buf ifc__buf /* buffer address */#define ifc_req ifc__req /* array of structures returned */

};

void print_ips(struct ifconf *ifc){

char *cp,*cplim,addr[INET6_ADDRSTRLEN];

struct ifreq *ifr=ifc->ifc_req;

cp=(char *)ifc->ifc_req;

cplim=cp+ifc->ifc_len;

for(;cpifr_name) + SIZE(ifr->ifr_addr))){

/* NOTE: You cannot just increment cp with sizeof(struct ifreq)

* as structures returned are of different length. */

ifr=(struct ifreq *)cp;

printf("%s :",ifr->ifr_name);

getip(ifr,addr);

printf("%s/n",addr);

}

return ;

}

main {

struct ifconf ifc;

int sd;

sd=socket(AF_INET6,SOCK_DGRAM,0);

alloc_buffer_size(sd,&ifc);

print_ips(&ifc);

}