套接字“无路由到主机”错误

6 投票
1 回答
16732 浏览
提问于 2025-04-16 04:21

我有一个连接,它在一个限制很严格的防火墙后面,只允许通过一个代理(10.10.1.100:9401)访问HTTP(S)。我得到的IP地址是动态的,子网掩码是255.255.255.255(我知道,这很奇怪!)。

我尝试写一个简单的Python套接字程序来连接这个代理,以便发送一些HTTP请求:

import socket

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
s.connect(( "10.10.1.100", 9401 ))
s.send("GET /index.html HTTP/1.1\r\nHost: aorotos.com\r\n\r\n")
d = s.recv(1024)
print d
s.close()

但是在连接时我遇到了一个异常(113,“没有到主机的路由”)。现在奇怪的地方来了——我可以使用这些相同的代理设置浏览网页,而且如果我通过netstat -tna检查当前连接的套接字,我能看到与10.10.1.100:9401的连接是活跃的。

我尝试了一个简单的命令,比如export http_proxy='10.10.1.100:9401' && wget aorotos.com/index.html,结果也能成功!如果我在wget中启用调试选项(-d),甚至可以获取到套接字的文件描述符。

我查看了wget的源代码,从我看到的情况来看,它也使用了普通的连接语句,并没有设置任何特殊的套接字选项(我稍后会更仔细地研究)。我在C语言中尝试了相同的代码,结果也失败了。

通过route命令提供的路由表是

Destination Gateway     Genmask     Flags   Metric Ref  Use Iface
default      *          0.0.0.0       U     0      0     0  gprs0

有没有人知道可能出了什么问题?

编辑:目前我的IP是10.16.82.250。这就是route输出中的所有内容。如果你感兴趣,我的外部IP是203.8.8.2。

ifconfig gprs0 -

gprs0     Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.17.221.94  P-t-P:10.17.221.94  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP  MTU:1400  Metric:1
          RX packets:1832 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10 
          RX bytes:1878364 (1.7 MiB)  TX bytes:224746 (219.4 KiB)

编辑2:我最后安装了tcpdump并查看了它的手册,最终安装了wireshark(我在我的N900上),才意识到,从数据包转储中,我在C程序和Python脚本中都使用了4901端口而不是9401!真是的!我怪小屏幕,还有我自己。

有没有办法以“我真傻”之类的方式结束这个问题?:P 抱歉占用了你们的时间!(我在这上面花了超过一周的时间。我真不敢相信我看了大部分wget的源代码!)

1 个回答

3

我不太确定问题出在哪里,但你可以试试用 Wireshark。这个工具可以让你看到网络层面发生了什么。通过Wireshark记录的数据,你应该能找到足够的信息来诊断你的问题。

撰写回答