【问题标题】:Cannot connect to host in C: Hostname not found (11001) on Windows, DNS Problem?无法连接到 C 中的主机:在 Windows 上找不到主机名 (11001),DNS 问题?
【发布时间】:2011-03-11 16:11:20
【问题描述】:

我正在尝试使用连接到 C 中的远程服务器的 API,但我一直收到以下错误消息:

log_message: 15:13:19.489 I [ap:1388] Connecting to AP A3.spotify.com:4070

log_message: 15:13:19.490 E [ap:1324] AP Socket Error: Hostname not found (11001)

log_message: 15:13:19.491 E [ap:3396] Connection error:  4

log_message: 15:13:19.491 I [ap:1388] Connecting to AP A1.spotify.com:80

正如您在日期中看到的那样,错误消息是即时的,所以我认为某些东西在我的计算机上本地阻止了这些消息。

这是我用 Wireshark 捕获的 TCP 流:

30  1.682802    MyLocalIp   193.182.8.15    HTTP    Continuation or non-HTTP traffic
31  1.702236    193.182.8.15    MyLocalIp   HTTP    Continuation or non-HTTP traffic
33  1.901706    MyLocalIp   193.182.8.15    TCP 50222 > http [ACK] Seq=12 Ack=12 Win=251 Len=0

因此,根据 Wireshark 的说法,我的计算机发送的第一条消息的 Header 校验和不正确。

我知道主机是正确的,因为当我在 Java 中使用相同的 C API 和 JNA 时,我得到以下结果:

log_message() called:15:46:48.718 I [ap:1388] Connecting to AP A1.spotify.com:4070

log_message() called:15:46:53.769 E [ap:1324] AP Socket Error: Undefined Error 0x4E20 (20000)

log_message() called:15:46:53.770 E [ap:3396] Connection error:  117

log_message() called:15:46:53.770 I [ap:1388] Connecting to AP A2.spotify.com:80

log_message() called:15:46:53.789 I [ap:938] Connected to AP: 193.182.8.12:80

所以,这里在4070端口连接失败,这是正常的,因为被公司的防火墙阻止了,然后在80端口连接成功。

这里是 Java 版本的 Wireshark 捕获:

104 6.296125    MyLocalIp   193.182.8.15    TCP 50339 > http [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=8 SACK_PERM=1
107 6.575599    193.182.8.15    MyLocalIp   TCP http > 50339 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=7
108 6.575732    MyLocalIp   193.182.8.15    TCP 50339 > http [ACK] Seq=1 Ack=1 Win=65536 Len=0
109 6.582627    MyLocalIp   193.182.8.15    HTTP    Continuation or non-HTTP traffic
110 6.614789    193.182.8.15    MyLocalIp   TCP http > 50339 [ACK] Seq=1 Ack=512 Win=6912 Len=0
112 6.714201    193.182.8.15    MyLocalIp   HTTP    Continuation or non-HTTP traffic
113 6.722057    MyLocalIp   193.182.8.15    HTTP    Continuation or non-HTTP traffic
115 6.746484    193.182.8.15    MyLocalIp   TCP http > 50339 [ACK] Seq=500 Ack=677 Win=8064 Len=0
116 6.750938    193.182.8.15    MyLocalIp   HTTP    Continuation or non-HTTP traffic
117 6.751093    MyLocalIp   193.182.8.15    HTTP    Continuation or non-HTTP traffic
118 6.985366    193.182.8.15    MyLocalIp   HTTP    [TCP Retransmission] Continuation or non-HTTP traffic
119 6.985416    MyLocalIp   193.182.8.15    TCP [TCP Dup ACK 117#1] 50339 > http [ACK] Seq=787 Ack=544 Win=65024 Len=0 SLE=500 SRE=544
121 7.013666    193.182.8.15    MyLocalIp   HTTP    Continuation or non-HTTP traffic
124 7.213661    MyLocalIp   193.182.8.15    TCP 50339 > http [ACK] Seq=787 Ack=1803 Win=65536 Len=0
132 7.703708    MyLocalIp   193.182.8.15    HTTP    [TCP Retransmission] Continuation or non-HTTP traffic
133 7.721265    193.182.8.15    MyLocalIp   HTTP    Continuation or non-HTTP traffic

我尝试在我的 System32/drivers/etc/hosts 文件中为主机名 A1.spotify.com、A2.spotify.com 和 A3.spotify.com 添加 IP 193.182.8.15,但没有任何改变。

我关闭了 Windows 防火墙和防病毒软件,也没有用。

我尝试在没有公司代理和防火墙的情况下在家中运行它,但它是相同的(除了在 Java 版本上该服务能够连接到端口 4070)

有什么想法吗?

谢谢!

【问题讨论】:

    标签: c windows sockets networking dns


    【解决方案1】:

    不正确的标头校验和并不重要。许多软件依赖于头校验和的硬件重新计算,因此它们很少在 CPU 中预先计算头校验和。由于wireshark会在信息发送到将其发送出去的芯片之前获取信息,因此wireshark会以某种频率报告不正确的标头校验和。

    请注意,最初的错误是处理主机 A3,但您的一些“证明”机器可访问已在主机 A1 和 A2 上得到证明。很可能这些主机不共享相同的 IP 地址,所以我会小心在 hosts 文件中“将它们全部设置为 X.X.X.X”。

    另请注意,绑定客户端可以配置为跳过主机文件条目。我不确定这里是否是这种情况,但我希望将公共名称服务器添加到 resolv.conf 文件(或等效文件)中,看看是否能得到更好的结果。如果您在“家里”运行的机器是您“在工作中”使用的同一台笔记本电脑,那么错误的 resolv.conf 文件就会“与您同行”。

    祝你好运

    【讨论】:

    • windows/system32/drivers/etc/hosts 相当于 "resolv.conf" 他说他试过了。
    • 主机文件不等同于 resolv.conf 文件。一个(主机文件)将主机名解析为 IP 地址。另一个(resolv.conf)配置将查询哪些 dns 服务器以及哪些域名可能附加到“起始”主机名。
    • 感谢您对 Wireshark 不正确的标头校验和的说明。我不认为这是 DNS 问题,因为通过 JVM 使用 API 时主机名已正确解析,并且我能够 ping 它。
    【解决方案2】:

    您没有说您使用的是哪个网络库。大概是第 3 方或内部图书馆。
    我会大胆猜测,但我敢打赌您的网络库需要 IP 地址而不是 DNS 名称?您是否尝试过将您的应用程序编程为仅连接到“193.182.8.15”而不是“a3.spotify.com”?如果可行,请调用 gethostbyname 将 DNS 名称解析为 IP 地址。

    这里有一些其他的尝试

    从命令行输入:

    ping a3.spotify.com
    

    如果成功,结果将如下所示:

    Pinging a3.spotify.com [193.182.8.15] with 32 bytes of data:
    Reply from 193.182.8.15: bytes=32 time=79ms TTL=49
    Reply from 193.182.8.15: bytes=32 time=79ms TTL=49
    Reply from 193.182.8.15: bytes=32 time=79ms TTL=49
    Reply from 193.182.8.15: bytes=32 time=79ms TTL=49
    
    Ping statistics for 193.182.8.15:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 79ms, Maximum = 79ms, Average = 79ms
    

    这个程序的输出告诉我两件事。

    1. a3.spotify.com 正确解析为 193.182.8.15。没有必要的主机文件黑客。 (也许在您的公司网络上您确实需要这个)。

    2. 由于我得到了有效的 ping,这意味着主机可能是可访问的。但是有些机器被配置为不接受 ping,因此缺少 ping 响应并不是一个明确的答案。查看 ping 是否成功解析主机名的重要事项。

    现在从命令行输入这个来测试到端口 80 的连接性。

    telnet a3.spotify.com 80没有 telnet?见下文

    它是否“连接”(并跳转到空白屏幕)? (按CTRL+]退出,再按“退出”)

    执行相同的 telnet,但端口 4070 除外。

    ping 和 telnet 是测试 DNS 解析和 IP:port 连接性的快速而肮脏的方法。

    上述这些命令可能不适用于您的公司网络,因为您的防火墙可能要求所有流量都通过代理。您的工作浏览器可能通过自动检测或管理员安装配置为以这种方式工作。如果是这种情况,那么您的应用程序不太可能在公司网络上运行 - 除非您的网络库可以配置为使用代理。 (某些网络库会自动检测或读取您的浏览器设置)。

    安装 Telnet 客户端 点击 开始按钮,点击控制面板, 然后单击程序。

    在程序和功能下,单击 打开或关闭 Windows 功能。如果 系统提示您输入管理员 密码或确认,键入 密码或提供确认。

    在 Windows 功能对话框中, 选中 Telnet 客户端复选框。

    点击确定。安装可能需要 几分钟。

    【讨论】:

    • 很抱歉没有早点回复您。谢谢你的建议。我可以 ping a3.spotify.com(它通常解析到不同的机器(IP 的最后一个字节不同))。我也可以在端口 80 上连接到它,但不能在我公司网络上的端口 4070 上连接。我使用的任何网络上都没有代理。
    【解决方案3】:

    我终于找到了解决方案: 以管理员身份运行我的程序解决了这个问题

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2016-12-22
      • 2021-03-04
      相关资源
      最近更新 更多