Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux下Ipv6源地址的选择_C_Linux_Ipv6 - Fatal编程技术网

C linux下Ipv6源地址的选择

C linux下Ipv6源地址的选择,c,linux,ipv6,C,Linux,Ipv6,为了从主机名获取目的地或应用目的地地址选择算法(根据RFC 3484),我们有一个库apigetaddrinfo()。如果你在网上搜索,你会发现相同的API可以用于源地址选择。但当我实际测试它时,它没有发生 当我做了一些家庭作业后,我发现在linux中,内核本身通过应用这些规则(按照RFC3484),根据目标地址来决定适当的源地址。这是由内核在fib6\u rule\u action()方法中完成的。这是在发送数据时完成的(例如在sendto()) 我的问题是,是否有任何库API或系统调用可以在

为了从主机名获取目的地或应用目的地地址选择算法(根据RFC 3484),我们有一个库api
getaddrinfo()
。如果你在网上搜索,你会发现相同的API可以用于源地址选择。但当我实际测试它时,它没有发生

当我做了一些家庭作业后,我发现在linux中,内核本身通过应用这些规则(按照RFC3484),根据目标地址来决定适当的源地址。这是由内核在
fib6\u rule\u action()
方法中完成的。这是在发送数据时完成的(例如在
sendto()


我的问题是,是否有任何库API或系统调用可以在发送数据之前的早期阶段为我执行此操作

您可以通过以下方式获得该信息。具体地说,这是您正在寻找的RTA_SRC

警告一句,(rt)netlink套接字不是最容易使用的协议,除了源代码之外,没有太多最新的文档。for netlink可能会帮助您开始。一些外部链接看起来不错,链接的文章包含了更多的参考资料

我建议使用一个库,如果您可以找到一个库,并且您的netlink相关代码比单一源地址查询更长。或者可能是好的。前者也有一个很好的页面


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

,以确保我明白这一点:您想向某人发送UDP数据包,并指定源地址?不清楚您真正想要什么,但如果您连接()套接字,您将使用getsockname()获取源地址。(如果将来内核路由表发生更改,则源地址可能也会更改-至少对于UDP)。是的,这是我想要的,但由于我有多个ipv6地址,我将如何决定从哪个源ip发送数据。是否有任何库API会根据目标IP地址实际给我排序的源IP列表。我在提到我猜的问题时没有那么清楚。如果你看到我对乔纳森·莱因哈特的评论,你就会得到我想要的。为了进一步澄清,我希望从多个IPv6地址IP(我有)系统中,根据我要发送数据的目标地址,应该给我最喜欢的地址。这有什么机制吗。我所说的“最喜欢的地址”是指应用RFC3484中定义的规则。(同样,我想要的是源地址,而不是目标地址,因为对于目的地,我们有getaddrinfo)我的答案指出了一种方法,可以完全按照您的要求执行。虽然它本身不是一个API,而是一个协议。@thouvila ip是一个实用程序,但我认为它会上升到路由级别。我从这个链接()中了解到,源地址选择在路由算法之后出现在图片中。这是真的还是我走错了方向???ip只是一个工具,是的。我将命令放在答案中,以帮助您了解rtnetlink套接字返回的信息类型。我不建议直接从您的程序调用ip。使用netlink套接字获取相同的信息。发送到rtnetlink的消息将返回linux FIB中选择的源地址,即链接描述的相同逻辑。我使用rtnetlink进行了尝试。现在我已经到了可以看到整个路由表的阶段。但当我把目标地址作为netlink消息的属性时,我还是会被绊倒。你能帮我做这个吗。此外,如果我们能够了解ip路由get如何在内部工作,那么它就可以得到解决。