问题描述
代码:
1 | getaddrinfo(localhost, "sunrpc", &hints, &result); // "sunrpc" 或 端口 111 都可以 |
这段代码,connect() 返回 -1 ,报错为 Protol not available 。
- 但是我们明明是通过
getaddrinfo()查询到的地址信息,为什么报错? - 这个报错也很具有误导性,我们开启了
IPv4,没有开启IPv6,如果开启IPv6,这个错误会消失,不支持IPv4?
排查过程
运行这些命令:
hostnamehostname -fhostname -ahostname -Ihostnamectlcat /proc/sys/kernel/hostnamemore /etc/host*/sbin/ifconfig -a
1 | $ hostname |
注:上面 cat /etc/hosts 的第二个 IP 进行了个人信息隐藏。xx 代表数字。
说明:
| 地址 | 协议版本 | 作用 |
|---|---|---|
| 127.0.0.1 | IPv4 | 本地回环地址,用于本机内部通信 |
| ::1 | IPv6 | 本地回环地址,用于本机内部通信 |
于是问题找到了:/etc/hosts/ 只配置了 ::1 ,那么使用 IPv4 协议尝试 connect localhost 就会返回 -1 。