ioctl SIOCGIFADDR を使用して、Linux のインターフェイスのアドレスを特定したいと考えています。これを行う方法を説明する Web リファレンスをいくつか見つけましたが、私のシステムには既にこれに関するリファレンスがあるはずです。SIOCGIFADDR とその仲間について説明している man ページ (またはその他のもの) はありますか? man netdevice
近いですが、問題のioctlがありません。
6171 次
4 に答える
4
s は廃止されたioctl
ようです。より良い方法 (より複雑ですが) を使用することnetlink
です。たとえば、netlink 経由ですべてのインターフェイスを一覧表示する方法については、この記事ioctl
を参照してください (バージョンについては、その記事のミニシリーズのパート 2を参照してください)。より簡単にインターフェースできるライブラリもあります。netlink
たとえば、libnlおよびlibmnlを参照してください。このSOの質問も参照してください。
編集: netlink 経由ですべてのインターフェイスの IP アドレスを取得する方法の例を次に示します。
于 2011-02-08T17:31:36.513 に答える
2
私のUbuntuシステムで(manページとヘッダーファイルをgrepして)見つけることができた最も近いman ioctl_list
ものは、呼び出しを次のようにリストするものです。
0x00008915 SIOCGIFADDR struct ifreq * // I-O
問題の構造体 ( ) は、各フィールドの意味を説明する簡単なコメントと共にifreq
宣言されています。/usr/include/net/if.h
/* 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)
上記以外では、Web が最善の策だと思います。
于 2011-02-08T17:27:57.497 に答える
1
于 2011-02-08T17:28:16.390 に答える
0
netintro(4)には最小限の要約があります。残念ながらLinuxでは利用できません
于 2011-02-08T17:42:52.387 に答える