I would like to use the ioctl SIOCGIFADDR to determine the address of an interface in Linux. I found some web refe开发者_StackOverflowrences that explain how to do this, but it seems like there should be some reference for this already on my system. Is there a man page (or something else) that describes SIOCGIFADDR and friends? man netdevice
is close, but it doesn't have the ioctl in question.
The ioctl
s seem to be deprecated. The better way (though way more complicated) is to use netlink
. See for example this article on how to list all interfaces via netlink (for an ioctl
version, see part 2 of that article mini-series). There are also libraries to interface with netlink
more easily, see for example libnl and libmnl. Also see this SO question.
Edit: Here's an example on how to get the IP addresses of all interfaces via netlink.
The closest I've been able to find on my Ubuntu system (by grepping through man pages and header files) is man ioctl_list
, which lists the call as:
0x00008915 SIOCGIFADDR struct ifreq * // I-O
The struct in question (ifreq
) is declared in /usr/include/net/if.h
along with brief comments explaining the meaning of each field.
/* Interface request structure used for socket ioctl's. All interface
ioctl's must have parameter definitions which begin with ifr_name.
The remainder may be interface specific. */
struct ifreq
{
# define IFHWADDRLEN 6
# define IFNAMSIZ IF_NAMESIZE
union
{
char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */
} ifr_ifrn;
union
{
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short int ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
__caddr_t ifru_data;
} ifr_ifru;
};
# define ifr_name ifr_ifrn.ifrn_name /* interface name */
# define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
# define ifr_addr ifr_ifru.ifru_addr /* address */
# define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
# define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
# define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
# define ifr_flags ifr_ifru.ifru_flags /* flags */
# define ifr_metric ifr_ifru.ifru_ivalue /* metric */
# define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
# define ifr_map ifr_ifru.ifru_map /* device map */
# define ifr_slave ifr_ifru.ifru_slave /* slave device */
# define ifr_data ifr_ifru.ifru_data /* for use by interface */
# define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
# define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
# define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */
# define ifr_newname ifr_ifru.ifru_newname /* New name */
# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)
Other than the above, I sense that the Web is your best bet.
ioctl_list(2)
netintro(4) has a minimal summary. Too bad its not available on linux
精彩评论