4

ioctl SIOCGIFADDR を使用して、Linux のインターフェイスのアドレスを特定したいと考えています。これを行う方法を説明する Web リファレンスをいくつか見つけましたが、私のシステムには既にこれに関するリファレンスがあるはずです。SIOCGIFADDR とその仲間について説明している man ページ (またはその他のもの) はありますか? man netdevice近いですが、問題のioctlがありません。

4

4 に答える 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

ioctl_list(2)

于 2011-02-08T17:28:16.390 に答える
0

netintro(4)には最小限の要約があります。残念ながらLinuxでは利用できません

于 2011-02-08T17:42:52.387 に答える