【问题标题】:Get the interface to be used by socket according to IP on Linux, with C/C++Linux下根据IP获取socket要使用的接口,用C/C++
【发布时间】:2021-12-24 15:25:13
【问题描述】:

根据this answer,调用connect时如果指定了目的地址,系统会自动选择socket要使用的接口。我正在寻找的是一种在使用 C 或 C++ 调用 connect 之前知道该接口名称的简单方法。我知道这可以通过命令route get to $ADDR 来完成,但是在程序中调用外部命令似乎有点脏。除了解析路由表或调用route之外,在C/C++中有没有其他方法可以做到这一点?

【问题讨论】:

  • 好吧,既然Linux是开源的,想必大家可以看看route的源代码,看看它做了什么,自己也做同样的事情吧?
  • 路由表中的内容决定了使用哪个接口。匹配最长的路线获胜,平局使用度量最低的并列路线。默认路由 (0.0.0.0/0) 匹配所有内容,但它是最短匹配 (0 长度),因此仅在没有其他匹配时使用。
  • 我不认为有内置的API可以做到这一点,所以你必须自己处理路由表。

标签: c++ linux sockets networking


【解决方案1】:

您可以打开一个 netlink 套接字并查询路由,然后过滤您需要的路由。这是一篇关于 Linux Journal 的文章,描述了这种方法:

https://www.linuxjournal.com/article/7356

这是它的 C 语言实现:

https://gist.github.com/javiermon/6272065

它只需要根据您的需要进行一些调整。

【讨论】:

  • 谢谢!与读取文件相比,我喜欢这提供了一种更理智的方式来访问路由表。
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 2013-01-03
  • 2012-01-02
  • 2012-03-15
  • 2020-05-06
  • 2023-03-19
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多