【BUG精选】00.IPC程序DNS请求一直发送到127.0.0.1

【BUG精选】00.IPC程序DNS请求一直发送到127.0.0.1

问题现象:

  1. 设备挂测/重启,偶现程序请求DNS到127.0.0.1,无法拿到域名对应的IP地址,平台无法连接。
  2. 但是Linux下的网络功能是正常的,可以正常的ping通服务器,拿到域名对应的IP地址。

问题定位:

  1. 通过查阅uclibc的源码,gethostaddr的具体实现,发现存在如下的逻辑:
  2. 每次调用DNS相关的参数,都会去读取文件/etc/resolv.conf文件,如果这个文件的修改时间和上次访问的时间一致,则不再更新,如果不一致,晚于之前记录的时间,则进行更新代码中全局变量存储的值。
  3. 基于此推测,可能由于多线程冲突,在他读取的时候,另外一个线程恰巧清空了整个文件,然后他读到空,就会去127.0.0.1 DNS请求。同时,清空文件的线程和读取文件的线程几乎是同一时间,导致代码后续再次调用获取域名IP的时候,不会再去更新全局配置中的DNS服务器地址。

问题解决:

  1. 在出现DNS获取失败的时候,调用函数:utime(“/tmp/resolv.conf”, NULL);
  2. 即可更新该文件的修改、访问时间,那uclibc就可以重新读取该文件的配置,正常的请求DNS了
是的,如果你在本地 `hosts` 文件中配置了: ``` 192.168.150.101 git.sl-express.com ``` 那么当你在浏览器中访问 `http://git.sl-express.com` 时,**请求会被发送到 IP 地址 `192.168.150.101`**,而不是通过 DNS 查询来解析这个域名。 --- ### ✅ 请求流程说明: 1. **浏览器发起请求**:访问 `http://git.sl-express.com` 2. **操作系统检查 hosts 文件**: - 发现 `git.sl-express.com` 被映射为 `192.168.150.101` - 不再进行 DNS 查询 3. **请求发送到 192.168.150.101** - 该 IP 地址的 80 或 443 端口(或其他配置端口)必须有 Web 服务在监听,否则连接失败 4. **服务器响应请求**(如果服务正常运行) --- ### 🔁 如果 Nginx 运行在本机(127.0.0.1),但你配置了 hosts 指向别的 IP 比如你本机运行了 Nginx,但你的 `hosts` 配置是: ``` 192.168.150.101 git.sl-express.com ``` 并且你访问的是: ``` http://git.sl-express.com ``` 那么: - 请求会被发送到 `192.168.150.101` - 如果这台机器上运行了 Web 服务(如 Nginx/Apache/后端服务),就能收到请求 - 如果这台机器没有服务在运行,会返回 `Connection refused` 或 `Timeout` --- ### 🧠 举个例子: 你本机配置了: ``` 192.168.150.101 git.sl-express.com ``` 你本地运行了 Nginx,绑定的是 `127.0.0.1`,而 `192.168.150.101` 并不是本机 IP: - 那么访问 `git.sl-express.com` 实际是访问局域网中某台机器(192.168.150.101) - 本机的 Nginx 不会收到请求 --- ### ✅ 总结: | 条件 | 请求目标 | |------|----------| | `hosts` 中配置了 `192.168.150.101 git.sl-express.com` | 请求发送到 `192.168.150.101` | | 该 IP 上运行了 Web 服务 | 请求成功处理 | | 该 IP 上没有服务或不可达 | 请求失败(超时或拒绝) | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值