在linux中选择Ipv6源地址

时间:2014-05-07 05:20:53

标签: c linux ipv6

要使目标派生自主机名或应用目标地址选择算法(根据RFC 3484),我们有一个库api getaddrinfo()。如果您在网上搜索,您会发现相同的API可用于源地址选择。但是当我实际测试它时它并没有发生。

当我做了一些功课时发现在Linux中,内核本身通过应用这些规则(根据RFC 3484)决定适当的源地址,具体取决于目标地址。这是由内核在fib6_rule_action()方法中完成的,这是在发送数据时完成的(例如在sendto()中)。

我的问题是,在发送数据之前,有任何库API或系统调用可以在早期阶段为我做这件事。

1 个答案:

答案 0 :(得分:0)

您可以通过linux routing sockets aka rtnetlink获取该信息。具体来说,这是你正在寻找的RTA_SRC。

警告,(rt)netlink套接字不是最容易使用的协议,除源代码外没有太多最新文档。 netlink的wikipedia page可能会让您入门。一些外部链接似乎很好,链接的文章包含更多参考。

我建议使用一个库,如果你能找到一个,你的netlink相关代码比单个源地址查询更长。 Libnllibmnl可能会很好。前者也有一个关于routing sockets的好页面。

作为测试,您可以使用用户空间命令ip -6 route get <dst_addr>获得相同的功能,例如ip -6 route get 2a00:1450:4010:c04::63