要使目标派生自主机名或应用目标地址选择算法(根据RFC 3484),我们有一个库api getaddrinfo()
。如果您在网上搜索,您会发现相同的API可用于源地址选择。但是当我实际测试它时它并没有发生。
当我做了一些功课时发现在Linux中,内核本身通过应用这些规则(根据RFC 3484)决定适当的源地址,具体取决于目标地址。这是由内核在fib6_rule_action()
方法中完成的,这是在发送数据时完成的(例如在sendto()
中)。
我的问题是,在发送数据之前,有任何库API或系统调用可以在早期阶段为我做这件事。
答案 0 :(得分:0)
您可以通过linux routing sockets aka rtnetlink获取该信息。具体来说,这是你正在寻找的RTA_SRC。
警告,(rt)netlink套接字不是最容易使用的协议,除源代码外没有太多最新文档。 netlink的wikipedia page可能会让您入门。一些外部链接似乎很好,链接的文章包含更多参考。
我建议使用一个库,如果你能找到一个,你的netlink相关代码比单个源地址查询更长。 Libnl或libmnl可能会很好。前者也有一个关于routing sockets的好页面。
作为测试,您可以使用用户空间命令ip -6 route get <dst_addr>
获得相同的功能,例如ip -6 route get 2a00:1450:4010:c04::63
。