【问题标题】:getaddrinfo "10 . 10 . 10 . 10"getaddrinfo "10 . 10 . 10 . 10"
【发布时间】:2011-12-05 21:57:31
【问题描述】:

我刚刚注意到,如果我将字符串“10 . 10 . 10 . 10”提供给 getaddrinfo,我会返回地址 0.0.0.10。结果在 OS X (Lion) 和 Linux (CentOS 5.6) 上是相同的。您可以通过以下方式轻松地自行验证:

$ curl 'http://10 . 10 . 10 . 10/' 
curl: (7) Failed to connect to 0.0.0.10: No route to host

这种行为是否有特定原因,还是我应该将其视为错误?我原以为它不会返回任何地址。

编辑:“10 asdf”的结果相同,猜测是空间造成的。

【问题讨论】:

  • 我使用 getaddrinfo 来验证是否在字段中输入了有效地址,而不是使用容易匹配不好的正则表达式(尤其是对于 IPv6)。
  • 但是你为什么一开始就允许空格作为地址的一部分呢?
  • 嗯,这就是我要问的不是吗。为什么 getaddrinfo 允许它?我现在在调用 getaddrinfo 之前添加了自己的空格检查,但我仍然认为这种行为很奇怪,并且想知道它是显式的还是意外的。
  • 你说你正在传递“10 . 10 . 10 . 10” getaddrinfo - 空格是从哪里来的?
  • 好的 - 所以重复我之前的问题,为什么你甚至首先允许空格构成地址的一部分,即你为什么允许用户输入IP 地址字段中的空格?

标签: linux macos sockets


【解决方案1】:

POSIX 允许由单个数字组成的字符串(可以是十进制、十六进制,以0x0X 开头,或八进制,以0 开头)来指定 IPv4 地址:参见定义inet_addr()(由getaddrinfo() 的定义引用,用于AF_INET 地址族)。

据我所知,它没有说明输入字符串是如何终止的,所以它停在空格处的事实可能只是一个实现细节;但是“10”当然是 IPv4 地址的允许表示,如果它被 getaddrinfo()inet_addr() 解析的话。 (有趣的是,inet_pton()AF_INET 不允许这种形式 - 它只接受标准的四组件形式。)

【讨论】:

  • 是的,我已经意识到没有比这更好的答案了。我想这是一个悬而未决的问题。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 2015-08-09
  • 2019-11-04
相关资源
最近更新 更多