inet_pton()对应于链路层地址

时间:2012-12-10 19:37:54

标签: c linux sockets networking mac-address

我有两个与我的实施相关的问题 -

  1. 我需要一个可以将给定链路层地址从文本转换为标准格式的函数,就像我们在n / w层有一个类似的IP地址inet_pton()函数,它转换给定的IP地址文本为标准IPv4 / IPv6格式。

  2. b / w链接层地址和48位mac地址是否有任何区别 (具体是IPv6)?

    如果不是,那么链接层地址的长度也应始终为48位,如果我没有错的话。

  3. 提前致谢。如果我遗漏了一些微不足道的事,请原谅。

    编辑:

    好的..我很清楚b / w链接层地址和以太网mac地址的区别。有几种类型的数据链路层地址,以太网mac地址只有一种。

    现在,这又出现了一个问题......正如我在第一个问题中所说,我需要将从命令行给出的链接层地址转换为其标准形式。此处提供的解决方案仅适用于以太网mac地址。

    目的不是有任何标准功能吗?我想要做的是创建一个应用程序,用户将在RFC 4861中所述的ICMP路由器广告消息中输入不同选项的值。

    Option Formats
    
    
    Neighbor Discovery messages include zero or more options, some of
    which may appear multiple times in the same message.  Options should
    be padded when necessary to ensure that they end on their natural
    64-bit boundaries.  All options are of the form:
    
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Type      |    Length     |              ...              |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       ~                              ...                              ~
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    Fields:
    
      Type           8-bit identifier of the type of option.  The
                     options defined in this document are:
    
                           Option Name                             Type
    
                        Source Link-Layer Address                    1
                        Target Link-Layer Address                    2
                        Prefix Information                           3
                        Redirected Header                            4
                        MTU                                          5
    
      Length         8-bit unsigned integer.  The length of the option
                     (including the type and length fields) in units of
                     8 octets.  The value 0 is invalid.  Nodes MUST
                     silently discard an ND packet that contains an
                     option with length zero.
    
      4.6.1. Source/Target Link-layer Address
    
    
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |    Length     |    Link-Layer Address ...
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    
       Fields:
    
       Type
                     1 for Source Link-layer Address
                     2 for Target Link-layer Address
    
       Length         The length of the option (including the type and
                     length fields) in units of 8 octets.  For example,
                     the length for IEEE 802 addresses is 1
                     [IPv6-ETHER].
    
       Link-Layer Address
                     The variable length link-layer address.
    
                     The content and format of this field (including
                     byte and bit ordering) is expected to be specified
                     in specific documents that describe how IPv6
                     operates over different link layers.  For instance,
                     [IPv6-ETHER].
    

    我不太习惯使用C ++,请提供C替代方案吗? 感谢。

1 个答案:

答案 0 :(得分:1)

你的第一个问题,它写起来并不难,而且由于MAC地址由6字节数组表示,因此你不需要考虑机器依赖性(如字节序和东西)

void str2MAC(string str,char* mac) {
    for(int i=0;i<5;i++) {
        string b = str.substr(0,str.find(':'));
        str = str.substr(str.find(':')+1);
        mac[i] = 0;
        for(int j=0;j<b.size();b++) {
            mac[i] *= 0x10;
            mac[i] += (b[j]>'9'?b[j]-'a'+10:b[j]-'0');
        }
    }
    mac[5] = 0;
    for(int i=0;i<str.size();i++) {
        mac[5] *= 0x10;
        mac[5] += (str[i]>'9'?str[i]-'a'+10:str[i]-'0');
    }
}

关于第二个问题,IP(和IPv6具体而言)是网络层协议,位于链路层之上,因此无需对链路层执行任何操作。 如果通过链路层意味着以太网,是的以太网地址总是48位,但还有其他链路层协议可以使用其他格式。