Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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 将getaddrinfo绑定到特定接口(源IP)_C_Linux_Networking_Dns_Client Server - Fatal编程技术网

C 将getaddrinfo绑定到特定接口(源IP)

C 将getaddrinfo绑定到特定接口(源IP),c,linux,networking,dns,client-server,C,Linux,Networking,Dns,Client Server,我使用getaddrinfo()获取与使用URL的服务器相对应的IP地址。它本质上是向DNS服务器发送DNS查询。我希望能够从特定的出站接口发送该查询。基本上,我有多个接口,通过这些接口可以发送DNS查询。当前,getaddrinfo()无法指定应该使用哪个接口发送DNS查询。是否是更改getaddrinfo()例程的唯一选项?有人知道实现这一点的其他方法吗?选择访问给定IP地址的接口由路由表决定 由于您可能拥有DNS服务器的IP,因此无论路由表表示要用于该IP地址的接口是什么,都可以访问该服务

我使用getaddrinfo()获取与使用URL的服务器相对应的IP地址。它本质上是向DNS服务器发送DNS查询。我希望能够从特定的出站接口发送该查询。基本上,我有多个接口,通过这些接口可以发送DNS查询。当前,getaddrinfo()无法指定应该使用哪个接口发送DNS查询。是否是更改getaddrinfo()例程的唯一选项?有人知道实现这一点的其他方法吗?

选择访问给定IP地址的接口由路由表决定

由于您可能拥有DNS服务器的IP,因此无论路由表表示要用于该IP地址的接口是什么,都可以访问该服务器,而不管是哪个应用程序发送请求

您需要修改路由表以强制特定接口上的流量。如果只有DNS服务器应该使用固定接口,您可以将该特定IP的路由添加到所需接口的路由表中


在Linux上,您可以通过
ip路由
命令行工具修改路由表。

这个问题的根本问题是,您似乎期望
getaddrinfo
只使用DNS,然后能够微调DNS查找的细节。但是,它并不是这样做的-它将使用系统上的所有名称解析功能,这通常意味着它将执行
主机
文件查找,以及
nsswitch.conf
中配置的任何其他功能,通常是DNS。对于某些非DNS查找,源地址绑定可能没有任何意义,因此它不是最小公分母接口的一部分

如果您知道,出于特定目的,您永远不需要从DNS以外的任何地方进行名称查找的响应,那么您可以使用DNS特定的功能,该功能将使您能够进行此类微调


中列出了几个DNS C库的示例,这似乎更像是名称解析程序和网络堆栈(路由)的问题,而不是程序代码中应该处理的任何问题。为什么一开始这甚至是一个问题?谢谢dbush。是的,但在我的例子中,我有一个多接口的多路径默认路由(主要是2个或更多)。我想从每个接口发送dns查询,但需要控制哪个查询使用的是接口A和接口N。因此需要控制在调用getaddrinfo()时选择哪个源接口。我检查了提示参数,但似乎没有选项