Ошибка сокета «Нет маршрута к хосту» - PullRequest
6 голосов
/ 20 сентября 2010

У меня есть соединение, которое находится за ограничительным межсетевым экраном, который разрешает доступ HTTP (S) только через прокси (10.10.1.100:9401).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, и даже она работает!Если я включу опцию отладки (-d) в wget, я даже смогу получить дескриптор файла сокета.

Я просмотрел исходный код wget, и из того, что я вижу, он тоже использует обычный оператор connect и не устанавливает никаких специальных опций сокетов (я расскажу об этом позже).Я пробовал тот же код в 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) только для того, чтобы понять, отдамп пакета, который я использовал порт 4901 вместо 9401 как в программе C, так и в скрипте python!Doh!Я виню маленький экран и, ну, сам.

Есть ли какой-нибудь способ закрыть этот вопрос "Я идиот" или что-то в этом роде?: P Извините, что занял ваше время!(Я потратил на это больше недели. Не могу поверить, что прошел большую часть исходного кода wget!)

1 Ответ

3 голосов
/ 20 сентября 2010

Я не уверен, в чем проблема, но попробуйте использовать Wireshark .Это, по крайней мере, позволит вам увидеть, что происходит на уровне сети.В журналах пакетов Wireshark должно быть достаточно информации для диагностики вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...