gethostbyname 双网络接口,select 使用哪一个

gethostbyname dual network interfaces, select which one to use

我有一个 c 程序需要连接到服务器并发送 tcp 负载并等待响应。这对于正常使用来说效果很好,但由于我有两个不同的网络接口,让我们在计算机 运行 程序上将它们称为 if0 和 if1,有时其中一个网络接口无法转发流量。很遗憾,这是我无法改变的事实。

为了优雅地处理这个问题,因为 OS 无法帮助我将数据路由到正确的接口,我使用 if0 和 if1 发送有效负载。我创建了一个套接字,并使用绑定将套接字绑定到特定接口,我对 if0 和 if1 都这样做。

不幸的是,这没有按我的计划进行,因为我用来解析主机名的 gethostbyname 当然只使用了一个接口。不幸的是,我无法在这个特定问题上更改 OS 配置,我需要绕过 OS 中的任何逻辑并确保流量进入特定接口。

我有以下地址查找代码:

struct hostent *remoteHostEnt = gethostbyname(hostName);

有没有什么方法可以让我也使用特定的接口来获取主机名?我想尝试使用 if0 和 if1 来使用 gethostbyname 并使用任何可接受的结果。

我是否需要自己实现 DNS 查找并为此使用套接字,或者 posix c 中是否有我可以使用的东西?或者也许有我可以使用的图书馆?

如果您不能更改系统配置,您几乎只能在应用程序中实施自己的 DNS 解析器。您可以将您的代码基于 ADNS, or on the DNS resolver included in Polipo

您可以使用 c-ares (as shown in c-ares specifying network interface for the DNS resolves) 对特定网络接口进行 DNS 查询。

How do I resolve an IP into host using c-ares? 有一个 c-ares 例子。