使用Curl排查HTTP问题的经历

背景

我的核心职责是MCU侧的CAN总线开发。在联调过程中,Soc端需依赖一个专用Box来生成第三方算法的运行License。联调期间,该Box无法生成License,严重阻碍了联调进度。本文记录了本人协助Soc同事定位并解决此问题的全过程。

Box策略分析

因为不清楚Box的策略,以下分析都是主观的,不⼀定准确。

Box有⼀个默认的网址,用于查看当前的状态信息。这个网址内容数据来源于Box的固件,存储在Box的非易失性存储器中。当Box启动后,收到请求时,固件会加载相关文件,然后通过http协议传输内容给PC,使得我们可以在本地浏览器查看信息。

PC不联网也可以生成license,这是因为当通过网线连接PC和Box时,PC和Box之间形成了⼀个本地网络,数据访问和设置过程都是在本地网络内进行的,不需要互联网连接。

http连接异常分析

错误信息

1
2
3
4
5
6
7
8
9
10
11
D:\share>python .\main_create_license.py
Traceback (most recent call last):
File "D:\software\Python\lib\site-packages\urllib3\connection.py", line
207, in _new_conn
socket_options=self.socket_options,
File "D:\software\Python\lib\site-packages\urllib3\util\connection.py",
line 60, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "D:\software\Python\lib\socket.py", line 752, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed

根据错误信息, socket.gaierror: [Errno 11001] getaddrinfo failed这个错误⼀般是尝试解析主机名以获取地址信息时失败了。

测试网络连接

PC和Box,通过网线连接,Box对应网络适配器是#2,使用 ipconfig 查看Box的IP地址。

地址是可以ping通的,可以说明:

  1. 设备能够通过网络到达目标地址,说明至少在网络层面上,设备和目标地址之间的路径是通的。

  2. 目标地址上的设备或服务处于开机状态,并响应了ICMP请求。

  3. 目标地址的防火墙和路由器配置允许ICMP包通过,没有被阻止。

即使地址可以ping通,也不能保证所有的网络服务都能正常工作,因为ping命令通常只检测ICMP协议的响应。

测试HTTP的连通性

对于HTTP,因为”ping”不支持HTTP协议,可以通过以下方法来测试:

  1. 使用浏览器访问: 直接在浏览器地址栏输入HTTP地址,如果服务器响应,说明是可访问的。(如下图)

  1. 在命令行中,可以使用 curl命令来测试HTTP地址。例如: curl http://xxx.local:3000/ ,这将发送⼀个HTTP GET请求,并显示响应内容。(如下所示)

    1
    2
    3
    4
    5
    C:\Users\uidq9792>curl http://xxx.local:3000/
    <!DOCTYPE html><html><head><title></title><link rel="stylesheet"
    href="/stylesheets/style.css"></head>
    ...
    </html>

问题一:浏览器无法访问Box网址

PC连接WiFi,浏览器无法访问Box网址,但curl可以获取到内容。

这种情况http是通的,不影响license生成,不过也可以解决。从错误码DNS_PROBE_FINISHED_NXDOMAIN来看,是域名解析问题。

方法⼀:

修改hosts文件(需要权限),绕过DNS解析。文件通常位于

1
C:\Windows\System32\drivers\etc\

如果域名对应的IP地址发生变化,需要手动更新 hosts 文件。

hosts文件是⼀个系统文件,用于将域名映射到IP地址。这个文件主要用于将特定的域名与IP地址关联起来,使得计算机可以直接通过这个映射关系来访问网络资源,而不需要通过DNS服务器进行域名解析

方法⼆:

断开PC的WiFi连接,然后重置适配器,刷新网页就行了。

问题二:Curl 无法解析主机名

1
curl: (6) Could not resolve host: xxx

出现这种情况,可以右键对应的网络适配器,然后点击诊断,这个过程会重置适配器(不用关心诊断的结果),然后重新执行curl命令,看是否可以获取到响应内容。

当可以获取到响应内容时,执行license生成脚本,成功执行的结果如下:

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2025 wrd
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信