2013-01-16 93 views
0

我使用netlink得到的接口,它的名称,型号等,但我不能得到L2地址(ugly_datanlmsghdr*):如何通过netlink获取网络链接L2地址?

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_总是空的。 我在做什么错误以及如何获取地址?

回答

1

也许斑点是这里的硬件地址不是字符串。尝试获取像这样的地址:

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; 

这对我有用。

0

下面是一个Python(Linux)的 '解决方案'(可以帮助别人):
这是在Python网络链路库中的第一个例子:
见:https://pypi.python.org/pypi/pyroute2/0.2.16
真正简单的安装:

$ sudo pip install pyroute2 

棒这在一个文件(我把它叫做netlink1.py),并使其可执行:

#!/usr/bin/env python 
from pyroute2 import IPRoute 

# get access to the netlink socket 
ip = IPRoute() 

# print interfaces 
print ip.get_links() 

# stop working with netlink and release all sockets 
# ip.release() (deprecated) 
ip.close() 

这打印出所有在一行上,然后:

$ ./netlink1.py | sed 's/\], /\n/g' | grep IFLA_ADD