我正在尝试使用连接到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的说法,我的计算机发送的第一条消息的标头校验和不正确。
我知道主机是正确的,因为当我在Java中使用与JNA相同的C API时,我得到以下结果:
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上连接)
有什么想法吗?
谢谢!
答案 0 :(得分:0)
不正确的标头校验和并不重要。许多软件依赖于头校验和的硬件重新计算,因此他们很少预先计算CPU中的头校验和。由于wireshark在将信息发送到芯片之前抓取信息,因此wireshark会报告错误的标头校验和。
请注意,原始错误正在处理主机A3,但主机A1和A2演示了一些机器可以访问的“证明”。这些主机不共享相同的IP地址的可能性很大,所以我会小心在hosts文件中“将它们全部设置为X.X.X.X”。
另请注意,绑定客户端可以配置为跳过主机文件条目。我不确定这是什么情况,但我希望在resolv.conf文件(或等效文件)中添加一个公共名称服务器,看看你是否得到了更好的结果。如果你在“家里”运行的机器是你在工作中使用的同一台笔记本电脑,那么一个糟糕的resolv.conf文件就会“和你一起旅行”。
祝你好运答案 1 :(得分:0)
您没有说明您正在使用哪个网络库。大概是第三方或内部图书馆 我会猜测,但我敢打赌你的网络库需要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
这个程序的输出告诉我两件事。
a3.spotify.com正确解析为193.182.8.15。没有主机文件需要破解。 (也许在你的公司网络上你需要这个)。
由于我获得了有效的ping,这意味着主机可能可以访问。但是有些机器被配置为不接受ping,因此缺少ping响应它不是一个明确的答案。重要的是看ping是否成功解析了主机名。
现在从命令行输入以测试与端口80的连接。
telnet a3.spotify.com 80
(没有telnet?见下文)
是否“连接”(并跳转到空白屏幕)? (按CTRL +]退出,然后按“退出”)
执行相同的telnet,端口4070除外。
ping和telnet是测试DNS解析和IP:端口连接的快速而又脏的方法。
以上命令可能无法在您的公司网络上运行,因为您的防火墙可能要求所有流量都通过代理。您的工作中的浏览器可能配置为通过自动检测或管理员安装以这种方式工作。如果是这种情况,那么您的应用程序不太可能在公司网络上运行 - 除非您的网络库可以配置为使用代理。 (某些网络库会自动检测或读取您的浏览器设置)。
安装Telnet客户端单击 单击开始按钮,单击控制面板, 然后单击“程序”。
在“程序和功能”下,单击“确定” 打开或关闭Windows功能。如果 系统会提示您输入管理员 密码或确认,键入 密码或提供确认。
在“Windows功能”对话框中, 选中Telnet客户端复选框。
单击“确定”。安装可能需要 几分钟。
答案 2 :(得分:0)
我终于找到了解决方案: 以管理员身份运行我的程序解决了问题