问题标签 [getaddrinfo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 带有指定提示的 getaddrinfo(3)->ai_socktype 不返回 IPv6 地址
假设以下代码模仿了该resolveip
实用程序的基本功能:
上面调用的代码google.com
作为它的第一个也是唯一的参数将输出类似于:
假设我们想去掉重复的条目。因此,让我们创建一个结构,其中包含有关我们希望检索哪种结果的提示。以下修改不会以任何方式影响输出,因为该结构已按照getaddrinfo(3)
手册页的要求初始化为默认值:
现在让我们通过将ai_socktype
字段指定为任意值来过滤掉重复的条目:
唉,我们现在丢失了 IPv6 地址:
现在让我们回到原来的无提示版本:
现在让我们改用手动过滤:
现在一切都按照预期的方式进行:
我很好奇将提示传递给getaddrinfo(3)
函数和手动过滤返回的记录之间的差异是从哪里出现的。使用 glibc 2.17 在 linux 内核 3.8.0-32 上测试。
c++ - 有本地主机名,在 Windows 上工作,但在 Linux 上不行
我写了一个程序来获取本地主机名。如果不是很明显,我的意思是获取本地机器的主机名类似于gethostname
方法,而不是获取字符串localhost
我使用getaddrinfo
withNULL
作为主机名,然后getnameinfo
使用第一个地址调用。
它在 Windows 机器上完美运行,并给了我规范的主机名,但在 Linux 中它没有给我本地主机名,给我::
IPv6 或0.0.0.0
IPv4。
请注意,我正在使用AI_PASSIVE
flag in getaddrinfo
,这意味着它给我的地址不超过两个。
如果getnameinfo
我使用NI_NAMEREQD
它失败。
我这样做是因为我有一个服务器,有时我想听所有接口,有时我想听一个特定的接口,我已经有了addrinfo
,如果可能的话,我只想从中获取主机名。
如何让它在 Linux 上运行?我错过了什么吗?
谢谢你的帮助。
这是我的代码:(跨平台、windows 和 Linux,只需复制并过去)您可以在两者上编译和运行并查看差异。
编辑
服务器也应该接受来自其他机器的客户端,所以它不能报告监听
::
or0.0.0.0
。我知道我可以像这样修补它:
if(std::string("::") == hostname || std::string("0.0.0.0") == hostname)
gethostname(hostname,100)
- 我不想得到
localhost
结果,除非地址是127.0.0.1
or::1
。
c++ - 为 IPv6 服务器选择一个监听地址(双栈)
对某些人来说,这似乎是一个奇怪的问题。但我已经搜索并没有找到任何答案。
当我想要一个双栈服务器时,我需要监听INADDR_ANY
IPv4 和in6addr_any
IPv6。
如果我有不止一张网卡,那么我需要选择是要全部收听,还是指定要收听的网卡。
对于这个确切的建议,我正在使用getaddrinfo
带有可配置主机名的方法。如果host_name
还没有配置,那么我getaddrinfo
用 NULL 调用,并获得两个“ANY”地址。如果我使用 IP(v6 或 v4)配置它,我只会得到一个地址,这也很好。
但是当我使用 myhostname
作为配置的 host_name 时,在 Windows 机器上我从getaddrinfo
3 个地址获取:一个 IPv4 地址和两个 IPv6 地址。第一个被 ipconfig 视为“链接本地 IPv6 地址”,第二个被视为“隧道适配器 6TO4 适配器:”部分下的“IPv6 地址”。地址排序如下:
- IPv6 链路本地
- IPv6 地址
- IPv4
所以,如果我在听所有的地址,双栈实际上是三栈。如果我采用第一个 IPv6 地址(因为它是配置了 host_name 的 IPv4 服务器中的约定),我只在“链接本地 IPv6 地址”上侦听,该地址比“IPv6 地址”更难访问,并且许多客户端可以' t 连接到它,而他们可以连接到 IPv4 地址。
现在我正试图进一步复杂化。我已将手机连接到 USB 并激活 USB Tethering。当我通过以下方式解析地址时,getaddrinfo
我得到 5 个地址:按此顺序:
- USB IPv6 链路本地
- 以太网 IPv6 链路本地
- IPv6 地址
- USB IPv4
- 以太网 IPv4
所以我的问题是:
如果只是 IPv4,我会说我只采用第一个 IPv4。并且不关心其余的。但是当使用 IPv6 时,看起来最后一个 IPv6 是最合适的。有什么约定吗?
如果我有多网络机器,我需要选择第一个网络,并同时监听 IPv4 和 IPv6,但这里的结果是混合的。再次,有什么约定吗?
我需要监听所有 IPv6 地址吗?在这种情况下,我将收听一个我不收听相应 IPv4 的 IPv6 地址。我希望避免它。
感谢您的任何帮助或评论。但是请不要建议只听“ANY”,因为我不能。
c - gethostbyname/getaddrinfo 不断失败,即使互联网连接已启动
背景
我们有一个小型无头机器,运行 Linux 内核 2.6.35 和一些在 ARM 硬件上的 Open Embedded 发行版。
据我们所知,我们使用的是 glibc 2.10.1。
该盒子有一个未连接的以太网和一个串行连接的 GSM/3G 调制解调器。我们已配置 PPP 以确保继续连接到 Internet。这部分工作没有问题。
我们有一个用 c(实际上是 c++)编写的程序,它使用套接字建立一些连接。该程序是使用 pthreads 进行大量多线程处理的。
要查找要连接的 IP 地址,我们使用 gethostbyname()。
当没有连接到 Internet 时,例如在初始启动期间或 SIM 卡从调制解调器中取出时,gethostbyname() 会返回 NULL,因为它应该返回 NULL。
症状
但有时 gethostbyname() 会一直返回 NULL,即使 Internet 连接已启动并正在运行。
使用时来自 getaddrinfo() 的错误代码是 EAI_NONAME ~“名称或服务未知”。我们手头没有来自 gethostbyname() 的错误代码,但它是等价的。
我们的分析
我们已通过(通过串行控制台)确保互联网连接正常
- 项目清单
- 查看 /var/log/messages 并确保 pppd 表示一切正常
- ping 主机名(转换为 IP 并回复 ok)
- 通过公共 IP 通过 ssh 连接到盒子
我们在进程中有两个线程对同一主机使用 gethostbyname()。它们的代码路径和函数略有不同,但对套接字函数使用通用代码,包括调用 gethostbyname() 的部分。
在 gethostbyname() 不断返回 NULL 的情况下,这通常只适用于其中一个线程,而不是每次都相同。另一个使查找完美。
此外,gethostbyname() 失败的线程可以通过简单的受控停止该线程并重新启动该函数来轻松启动,然后重新启动一个新线程 pthread-wise。
总的来说,我们确信 DNS 翻译和互联网连接在操作系统级别运行良好。
为了排除线程问题,我们使用 getaddrinfo() 重新实现了查找代码,根据手册页,它是可重入的。并得到完全相同的结果。
对我们来说,线程的退出似乎会导致某种影响 gethostbyname()/getaddrinfo() 进行查找的能力的清理。
一种解决方法是强制退出失败的线程,但这意味着应用程序结构的重大变化,并不是真正的选择。
问题
所以问题是:您是否有任何指示可以在哪里寻找解决方案或真正的问题可能在哪里?
node.js - 如何捕获 getaddrinfo ENOTFOUND
在处理一些数据之前,我有一个需要检查的链接列表。使用 http.get 检查标头会返回错误:
我无法处理此错误,并退出该过程。我在 http.get 上尝试了 res.on("error") 和 try..catch,但没有任何效果。
下面是代码片段,这里是 runnable.com 上的实时示例
sockets - getaddrinfo 的提示参数是什么?
我无法理解hints
参数 in 的用法getaddrinfo()
类似下面的相同示例代码getadderinfo()
读起来hints
好像hints
永远不会被设置值。
http://manpages.ubuntu.com/manpages/hardy/man3/getaddrinfo.3.html
http://www.freebsd.org/cgi/man.cgi?query=getaddrinfo&sektion=3
那是hints
为了什么?
我必须检查hints
何时getaddrinfo
返回的值吗?
c - 如何在 Windows 上使用 getaddrinfo()
我正在尝试使用 mingw+msys 构建我的 APP。
我的代码使用winsock。当我编译它时,我收到以下错误消息:
这是我从 Linux 迁移的代码,更改了一些标头。
如何gettarrinfo()
在 Windows 中使用?
这是在尝试 dgreenday 的文章后更改消息的附加信息。
python - 重新连接期间的 getaddrinfo 行为
我注意到 python 的一些奇怪行为socket.getaddrinfo()
。
如果我连接到 wifi 并调用 socket.getaddrinfo(),它可以工作(当然可以!):
如果我断开连接,那么我将收到一个错误:
最后,如果我重新连接,它将再次工作。
现在这是奇怪的部分。
如果我首先关闭我的wifi,打开一个python终端,然后调用socket.getaddrinfo,正如预期的那样,我将收到与以前相同的错误
但是当我打开wifi时,无论我尝试多少次,我都会继续收到同样的错误!我可以尝试其他主机,它也会失败。
如果我手动向我的/etc/hosts
文件添加一个条目,那么它将返回我在主机文件中放置的任何内容。但是,其他请求继续失败。
这里发生了什么?我难住了。
c - 如何获取我连接的接口
我正在尝试实现一个在分接接口上接收数据包(可能是 ICMP)的应用程序。我有这样的代码。
两个问题:
现在,一旦我在选择时收到一些东西,我如何找出数据包到达哪个分接接口?
另外我该如何测试这段代码。我有这些接口UP,我如何注入数据包以便这个接收功能可以工作?有人可以发出命令吗?ping 应该可以工作(它发送 ICMP 数据包)。什么是正确的命令。我试过“ping -I tap0 localhost”
c - 以编程方式获取网络中所有活动路由器的 IP 地址
至于我最后一年项目的一部分,我想获得网络中所有活动路由器的 IP 地址列表,以便我可以通过标志获得它getaddrinfo
的AI_ADDRCONFIG
IPv6 状态。
当前的实现getaddrinfo
一次使用 1 个 IP,每次需要检查另一个 IP 时,我都需要从源更改 IP。我的目标是创建活动路由器的 IP 地址列表并将 IP 地址解析为getaddrinfo
方法。
如果您的专家能给我指出任何参考资料或在网络中提供任何示例代码段,我将不胜感激get all the IP addresses of active routers
。
PS:我在stackoverflow中找到了关于这个主题的类似帖子(找出网络上所有活动机器的IP),但这些对我没有帮助,因为它们适用于java和android,并且比我的主题稍微偏离主题()。