c - gethostbyname 双网络接口(interface),选择使用哪一个

标签 c networking dns posix gethostbyname

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

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

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

我有以下用于地址查找的代码:

struct hostent *remoteHostEnt = gethostbyname(hostName);

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

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

最佳答案

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

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

关于c - gethostbyname 双网络接口(interface),选择使用哪一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012920/

相关文章:

docker - Nginx Plus无法使用Docker嵌入式DNS服务器解析服务

amazon-web-services - 无法更新Kops群集-DNS查找错误

c - 为什么 atoi 无法正确转换为整数?

c - `something'的多重定义

c# - 跟踪 TCP 上已连接客户端的最佳方法是什么?

sockets - D receiveFrom没有收到完整的数据包

linux - linux 如何提取我的 mac 地址以通过链接发送?

Node.js - 每个用户的子域 + 允许自定义域

c++ - 在 Solaris 和 Linux 上使用#pragma pack(1) 时结构大小的差异

c - 如何在 C 中创建最低有效位设置为 1 的掩码