Russian Qt Forum

Qt => Работа с сетью => Тема начата: Roman_L от Август 23, 2010, 11:06



Название: Разрешить доменное имя через прокси
Отправлено: 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 пробовал в разных вариантах - нет успеха. Сижу в окнах.


Название: Re: Разрешить доменное имя через прокси
Отправлено: merke от Август 23, 2010, 12:53
Код:
s.connectToHost(QHostAddress("74.125.77.147"), 80, QIODevice::ReadWrite);

Нафиг убери QString


Название: Re: Разрешить доменное имя через прокси
Отправлено: Sahab от Август 23, 2010, 13:20
Цитировать
Нафиг убери QString
действенное замечание))


Название: Re: Разрешить доменное имя через прокси
Отправлено: Roman_L от Август 23, 2010, 13:39
Цитировать
Нафиг убери QString
действенное замечание))
действительно.

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

Кто виноват то в этой ситуации? По идее DNS делает прокси? Или ОС моей машины? И как ходдят в нет опера и пси тогда...


Название: Re: Разрешить доменное имя через прокси
Отправлено: zenden от Август 23, 2010, 13:50
Roman_L
Вы пишете

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

или

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

если первый вариант, то он работать не будет


Название: Re: Разрешить доменное имя через прокси
Отправлено: BRE от Август 23, 2010, 14:03
Документация. Описание класса QHostAddress.
Цитировать
Note: Please note that QHostAddress does not do DNS lookups. QHostInfo is needed for that.


Название: Re: Разрешить доменное имя через прокси
Отправлено: Roman_L от Август 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"


Название: Re: Разрешить доменное имя через прокси
Отправлено: zenden от Август 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.


Название: Re: Разрешить доменное имя через прокси
Отправлено: Roman_L от Август 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 оно не понимает....


Название: Re: Разрешить доменное имя через прокси
Отправлено: zenden от Август 23, 2010, 14:37
Я еще раз перечитал документацию, и пришел к выводу что Qt вообще не поддерживает DNS Lookup через прокси, т.е. QHostInfo преобразует адреса локальным образом.

Тем не менее, даже если QHostInfo не будет работать, подключение по доменному имени через s.connectToHost("hostname") работать должно!


Название: Re: Разрешить доменное имя через прокси
Отправлено: crossly от Август 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 иначе резольвятся локально...


Название: Re: Разрешить доменное имя через прокси
Отправлено: zenden от Август 23, 2010, 16:46
crossly
а это не был перевод.
Но я потом понял, что то что я цитировал к делу не относится.


Название: Re: Разрешить доменное имя через прокси
Отправлено: Roman_L от Август 24, 2010, 10:31
Я еще раз перечитал документацию, и пришел к выводу что Qt вообще не поддерживает DNS Lookup через прокси, т.е. QHostInfo преобразует адреса локальным образом.

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

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

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

Знающих как делается резолв в приложениях на qt прошу откликнуться.
ЗЫ. Скачал исходники Psi. Не нашел даже упоминания класса QNetworkProxy.


Название: Re: Разрешить доменное имя через прокси
Отправлено: Roman_L от Август 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-шных примерах, как у меня...