0

インターフェイス、その名前、タイプなどを取得するために使用netlinkしていますが、L2 アドレスを取得できません ( ugly_datais nlmsghdr*):

struct ifinfomsg *iface;
struct rtattr *attribute;
int len;

iface = (struct ifinfomsg *) NLMSG_DATA(ugly_data);
len = ugly_data->nlmsg_len - NLMSG_LENGTH(sizeof(*iface));

for (attribute = IFLA_RTA(iface);
     RTA_OK(attribute, len);
     attribute = RTA_NEXT(attribute, len))
{
  id_ = iface->ifi_index;

  // get type
  switch (iface->ifi_type)
  {
  case ARPHRD_ETHER:
    type_ = "Ethernet";
    break;
  case ...
  }

  // get attributes
  switch (attribute->rta_type)
  {
  case IFLA_IFNAME:
    name_ = (char *) RTA_DATA(attribute);
    break;
  case IFLA_ADDRESS:
    address_ = (char *) RTA_DATA(attribute);
    break;
   ...
  }
}

type_から得たのid_name_同じように、正しい値が含まれていますが、ifconfig常にaddress_空です。何が間違っているのか、アドレスを取得する方法は?

4

2 に答える 2

4

おそらく問題は、ここのハードウェア アドレスが文字列ではないことです。次のように address_ を取得してみてください。

case IFLA_ADDRESS:
  char buffer[64];
  unsigned char* ptr = (unsigned char*)RTA_DATA(attribute);
  snprintf(buffer, 64, " %02x:%02x:%02x:%02x:%02x:%02x", 
      ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
  std::cout << "address : " << buffer << std::endl;

これは私にとってはうまくいきます。

于 2013-02-03T15:51:39.400 に答える