套接字“无路由到主机”错误
我有一个连接,它在一个限制很严格的防火墙后面,只允许通过一个代理(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
的源代码!)