Russian Qt Forum
Ноябрь 23, 2024, 20:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разрешить доменное имя через прокси  (Прочитано 11937 раз)
Roman_L
Гость
« : Август 23, 2010, 11:06 »

Всем доброго времени суток!
Имею следующую проблему: при задании имени хоста ip адресом - есть коннект, при задании именем - нет коннекта.
Сижу за прокси и никак не пойму в чем дело.
Код:
#include <QtCore>
#include <QtNetwork>

int main(int argc, char** argv)
{
QCoreApplication app(argc, argv);
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::HttpProxy);
proxy.setHostName("10.10.10.202");
proxy.setPort(8080);
proxy.setUser("username");
proxy.setPassword("password");
QNetworkProxy::setApplicationProxy(proxy);
QTcpSocket s;
s.setProxy(proxy);
s.connectToHost(QHostAddress(QString("74.125.77.147")), 80, QIODevice::ReadWrite);
if(s.waitForConnected(2000)) {
qDebug() << "connectToHost!";
s.disconnectFromHost();
} else {
qDebug() << s.error();
qDebug() << s.errorString();
}
return 0;
}
выдает это:
Цитировать
QAbstractSocket::HostNotFoundError
"Host not found"
upd: Да, 10.10.10.202 - это адрес проксисервера. Всякие setProxy пробовал в разных вариантах - нет успеха. Сижу в окнах.
« Последнее редактирование: Август 23, 2010, 11:09 от Roman_L » Записан
merke
Гость
« Ответ #1 : Август 23, 2010, 12:53 »

Код:
s.connectToHost(QHostAddress("74.125.77.147"), 80, QIODevice::ReadWrite);

Нафиг убери QString
« Последнее редактирование: Август 23, 2010, 12:56 от Александр » Записан
Sahab
Гость
« Ответ #2 : Август 23, 2010, 13:20 »

Цитировать
Нафиг убери QString
действенное замечание))
Записан
Roman_L
Гость
« Ответ #3 : Август 23, 2010, 13:39 »

Цитировать
Нафиг убери QString
действенное замечание))
действительно.

Ещё раз о проблеме. Не транслируется адрес с символьной записи в ip адрес. Как видим с прокси и с сервером (по ip) связь устанавливается, но с сервером по символьному адресу (через прокси) нет связи.

Кто виноват то в этой ситуации? По идее DNS делает прокси? Или ОС моей машины? И как ходдят в нет опера и пси тогда...
Записан
zenden
Гость
« Ответ #4 : Август 23, 2010, 13:50 »

Roman_L
Вы пишете

Код
C++ (Qt)
s.connectToHost(QHostAddress(QString("hostname")), 80, QIODevice::ReadWrite);

или

Код
C++ (Qt)
s.connectToHost("hostname", 80, QIODevice::ReadWrite);

если первый вариант, то он работать не будет
Записан
BRE
Гость
« Ответ #5 : Август 23, 2010, 14:03 »

Документация. Описание класса QHostAddress.
Цитировать
Note: Please note that QHostAddress does not do DNS lookups. QHostInfo is needed for that.
Записан
Roman_L
Гость
« Ответ #6 : Август 23, 2010, 14:11 »

да-да. Там не совсем корректно. Но на суть это пока не влияет.
Код:
qDebug() << QHostInfo::fromName(QString("google.com")).addresses();

возвращает пустые скобочки...

upd.

Код:
	 QHostInfo hi(QHostInfo::fromName("google.com"));
qDebug() << hi.addresses() << "hi";
qDebug() << hi.error();
qDebug() << hi.errorString();
Цитата: console
() hi
1
"Host not found"
« Последнее редактирование: Август 23, 2010, 14:16 от Roman_L » Записан
zenden
Гость
« Ответ #7 : Август 23, 2010, 14:20 »

Цитировать
Domain names are resolved through the SOCKS5 server if the QNetworkProxy::HostNameLookupCapability is enabled, otherwise they are resolved locally and the IP address is sent to the server

доменные имена не могут преобразовываться в IP адреса через HTTP proxy.
Записан
Roman_L
Гость
« Ответ #8 : Август 23, 2010, 14:32 »

Цитировать
Domain names are resolved through the SOCKS5 server if the QNetworkProxy::HostNameLookupCapability is enabled, otherwise they are resolved locally and the IP address is sent to the server

доменные имена не могут преобразовываться в IP адреса через HTTP proxy.
Ага!! Вот оно! Спасибо! как раз SOCKS5 оно не понимает....
Записан
zenden
Гость
« Ответ #9 : Август 23, 2010, 14:37 »

Я еще раз перечитал документацию, и пришел к выводу что Qt вообще не поддерживает DNS Lookup через прокси, т.е. QHostInfo преобразует адреса локальным образом.

Тем не менее, даже если QHostInfo не будет работать, подключение по доменному имени через s.connectToHost("hostname") работать должно!
Записан
crossly
Гость
« Ответ #10 : Август 23, 2010, 14:39 »

Цитировать
Domain names are resolved through the SOCKS5 server if the QNetworkProxy::HostNameLookupCapability is enabled, otherwise they are resolved locally and the IP address is sent to the server

доменные имена не могут преобразовываться в IP адреса через HTTP proxy.
перевод не ахти.... могут резольвится через прокси при включенном QNetworkProxy::HostNameLookupCapability иначе резольвятся локально...
Записан
zenden
Гость
« Ответ #11 : Август 23, 2010, 16:46 »

crossly
а это не был перевод.
Но я потом понял, что то что я цитировал к делу не относится.
Записан
Roman_L
Гость
« Ответ #12 : Август 24, 2010, 10:31 »

Я еще раз перечитал документацию, и пришел к выводу что Qt вообще не поддерживает DNS Lookup через прокси, т.е. QHostInfo преобразует адреса локальным образом.

Тем не менее, даже если QHostInfo не будет работать, подключение по доменному имени через s.connectToHost("hostname") работать должно!
По идее Qtшные либы дергают системные вызовы, не более. И уже ОС резолвет имена, локально-глобально - её забота.

Это как оно будет работать без ip?

В целом. Долго комбинировал тип прокси, флаги capabilities,... и прочее. Все, кроме резолва имен работает на ура. С самого сервера все тоже работает на ура.
(на сервере окноХР, usergate, адсл с авторизацией(бриджом), в проксе есть галочка "Разрешить DNS-forward", но она не установлена.)

Знающих как делается резолв в приложениях на qt прошу откликнуться.
ЗЫ. Скачал исходники Psi. Не нашел даже упоминания класса QNetworkProxy.
Записан
Roman_L
Гость
« Ответ #13 : Август 26, 2010, 08:04 »

Цитировать
Domain names are resolved through the SOCKS5 server if the QNetworkProxy::HostNameLookupCapability is enabled, otherwise they are resolved locally and the IP address is sent to the server

доменные имена не могут преобразовываться в IP адреса через HTTP proxy.
Моя "рабочая" опера незнает даже что у нас на проксе есть порт для SOCKS5...

ЗЫ. Посмотрел qutIM, прокся сделана как в qt-шных примерах, как у меня...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 20.