Здравствуйте, vasilchmax, Вы писали:
V>Хм, а как же тогда получить нормально?
"Нормально" — никак. Кто тебе сказал что у твоего хоста вообще есть имя? Кто тебе сказал что оно у него одно?
Действительно ли тебе необходимо его получать? И что ты будешь делать, если получить все-таки не удастся?
Здравствуйте, vasilchmax, Вы писали:
V>Здравствуйте, Stuw, Вы писали:
S>>То есть ты хочешь сказать, что у тебя соединение с удаленной машиной идет в основном потоке и ты хочешь уложиться в 100 мс?
V>Да, чтобы ГУИ не зависало при определении. Думал с потоке сделать, но как раньше уже писал, возникают проблемы при передачи в основной поток параметров. В принципе параметр не только QHostInfo, но и еще много других.
Вы пробовали конектится к несуществующему/выключенному хосту? В зависимости от того, какой стоит таймаут, процесс соединения может занять до полуминуты (на вскидку, более точные цыфры надо смотреть).
Лучше разобраться с многопоточностью. Расскажи какие проблемы при передаче параметров (и как собственно устроен вспомогательный поток), и возможно тебе помогут.
з.ы. Меня, например, очень бесит, когда приложение подвешивает гуй при коннекте ))
Здравствуйте, Stuw, Вы писали:
S>То есть ты хочешь сказать, что у тебя соединение с удаленной машиной идет в основном потоке и ты хочешь уложиться в 100 мс?
Да, чтобы ГУИ не зависало при определении. Думал с потоке сделать, но как раньше уже писал, возникают проблемы при передачи в основной поток параметров. В принципе параметр не только QHostInfo, но и еще много других.
Обработка соединения с хостом:
void PCLister::havePC()
{
QHostInfo info;
info.setHostName(socket->peerName());
//Здесь идет дальнейшая обработка
}
Вопрос в том, что имя компа по айпи не определяется . В socket->peerName() находится не имя, а собственно передаваемый при соединении IP. Кто-то знает, в чем может быть причина?
Здравствуйте, vasilchmax, Вы писали:
V>Пытаюсь определить имя хоста по его айпи.
V>Соединение с хостом: V>socket=new QTcpSocket(); V>//connect(socket, SIGNAL(connected()), this, SLOT(havePC()), Qt::DirectConnection); V>connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), V> this, SLOT(haveError(QAbstractSocket::SocketError)), Qt::DirectConnection); V>connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); V>socket->connectToHost(hostIP, port); V>socket->waitForConnected(timeout); V>socket->disconnectFromHost();
V>Обработка соединения с хостом: V>void PCLister::havePC() V>{ V> QHostInfo info; V> info.setHostName(socket->peerName()); V> //Здесь идет дальнейшая обработка V>}
V>Вопрос в том, что имя компа по айпи не определяется . В socket->peerName() находится не имя, а собственно передаваемый при соединении IP. Кто-то знает, в чем может быть причина?
Имхо, если судить по идеологии класса, то ты можешь присоединиться к серверу указав его имя или ip адрес. Резолвить имя по ip адресу тут незачем.
Посмотри класс QHostInfo.
Здравствуйте, Stuw, Вы писали:
S>Имхо, если судить по идеологии класса, то ты можешь присоединиться к серверу указав его имя или ip адрес. Резолвить имя по ip адресу тут незачем. S>Посмотри класс QHostInfo.
Хм, а как же тогда получить нормально? Особенно если учитавать, что время получения ограничено в 100 мс, больше нежелательно, т.к. идет основной поток. Думал раньше реализовать через QHostInfo::lookupHost() причем в другом потоке, но возникли проблемы с передачей переменной QHostInfo в основной поток.
Здравствуйте, vasilchmax, Вы писали:
V>Здравствуйте, Stuw, Вы писали:
S>>Имхо, если судить по идеологии класса, то ты можешь присоединиться к серверу указав его имя или ip адрес. Резолвить имя по ip адресу тут незачем. S>>Посмотри класс QHostInfo.
V>Хм, а как же тогда получить нормально? Особенно если учитавать, что время получения ограничено в 100 мс, больше нежелательно, т.к. идет основной поток. Думал раньше реализовать через QHostInfo::lookupHost() причем в другом потоке, но возникли проблемы с передачей переменной QHostInfo в основной поток.
То есть ты хочешь сказать, что у тебя соединение с удаленной машиной идет в основном потоке и ты хочешь уложиться в 100 мс?
Здравствуйте, Michael Chelnokov, Вы писали:
MC>"Нормально" — никак. Кто тебе сказал что у твоего хоста вообще есть имя? Кто тебе сказал что оно у него одно? MC>Действительно ли тебе необходимо его получать? И что ты будешь делать, если получить все-таки не удастся?
Имя у хоста точно есть, т.к. все хосты из локалки и все названы. Причеем имя только одно, но это неважно, нужно найти хотя бы первое.
Получить очень даже желательно,т.к. я пишу сканер локалки на общие ресурсы и выводить список только из айпи не очень красиво получится
Если не найду... в принципе другие программы находят, я тоже по идее должен
С передачей параметров вроде разобрался. Оказалась, напутал с qRegisterMetaType(). Теперь возник вопрос немного другого характера, связанный с потоками.
Вот мой код:
//Запуск проверки хостов
//PClist — потомок QThread, ему передаются различные параметры соединения
for(int i=1; i < 254; i++)
{
PCList *pc_list=new PCList(netmask+QString::number(i)/*это IP*/,conn_port/,timeout, this);
pc_list->setObjectName(QString("pc_list%1").arg(i));
Я в многопоточном программировании не очень (так что сильно не бейте ), поэтому возможно (точнее наверняка ) что-то сделал не так. При таком коде все работает, но судя по всему неправильно. Потоки не получают свой цикл обработки событий, т.к. главный поток время от времени виснет И еще одно, почему-то после закрытия программы выпадает сообщение об ошибке "Cannot send event to objects owned by other thread".
Здравствуйте, vasilchmax
V>Я в многопоточном программировании не очень (так что сильно не бейте ), поэтому возможно (точнее наверняка ) что-то сделал не так. При таком коде все работает, но судя по всему неправильно. Потоки не получают свой цикл обработки событий, т.к. главный поток время от времени виснет И еще одно, почему-то после закрытия программы выпадает сообщение об ошибке "Cannot send event to objects owned by other thread".
Проблема с потоками, если я не ошибаюсь в том, что ты устанавливаешь сигналы не в главном потоке. Вынеси инициализацию сигналов из функции run.
И почитай про многопоточность в Qt
Теперь про поиск.
Ты ищешь по фтп и пытаешься соединиться с фтп сервером?
У тебя запускается 254 дополнительных потока — это слишком круто для системы. У тебя все остальные приложения нормально работают, когда начинает выполняться этот код?
Добавлять компьютеры в список думаю лучше по мере поступения информации.
Варианты определения, которые я вижу:
1. Несколько потоков — на каждый поток диапазон адресов.
Проблема — долгий коннект к несуществующим компам может хорошо затормозить весь процесс определения (но можно поставить таймаут на коннект поменьше. для локалки должно прокатить)
2. Широковещательный пинг (на крайняк просто пинг)
Проблема: файрволы
3. Использование протоколов, которые подняты на всех компах локалки (а ля смб)
Некоторые оптимизации:
а. Сделать список индексируемых компьютеров (тех кто согласится индексироваться, либо свой список) и резолвить по этому списку (он сильно ограничит количество вариантов)
Попробую сделать инициализацию сигналов в главном потоке. Статью по ссылке читал (входит в QAssistant)
Теперь про поиск.
Я ищу не список ФТП (но можно и ФТП тоже искать ), а список обычных расшареных ресурсов. Все потоки, которые запускаются, практически сразу удалаются, после того, как соединяются с компом и получают список ресурсов и другой информации.
По вопросам:
1. Можно попытаться
2. А как его реализовать в Qt не подскажете?
3. Не очень знаю как сделать . В принципе на 90+% компов стоит Windows, но есть и *nix'ы.
На счет оптимизаций.
а. Не имеет смысла. В сети 200+ компов в одном сетевом диапазоне, причем количество растет.
б. Попробую.
И еще одно. Непонятно почему socket->peerName(); в 3-ей функции не имя хоста, а его ИП
Здравствуйте, vasilchmax, Вы писали:
V>Попробую сделать инициализацию сигналов в главном потоке. Статью по ссылке читал (входит в QAssistant) V>Теперь про поиск. V>Я ищу не список ФТП (но можно и ФТП тоже искать ), а список обычных расшареных ресурсов. Все потоки, которые запускаются, практически сразу удалаются, после того, как соединяются с компом и получают список ресурсов и другой информации.
Если в одно время запущено много потоков, то системе будет тяжко.
V>По вопросам: V>1. Можно попытаться V>2. А как его реализовать в Qt не подскажете?
пинг чисто с помощью qt никак — http://lists.trolltech.com/qt-interest/2002-10/thread00351-0.html
V>3. Не очень знаю как сделать . В принципе на 90+% компов стоит Windows, но есть и *nix'ы.
Например, если попытка получить список расшареных ресурсов провалилась, считать комп отключенным. (ты же уже как-то получаешь список ресурсов?)
V>На счет оптимизаций. V>а. Не имеет смысла. В сети 200+ компов в одном сетевом диапазоне, причем количество растет. V>б. Попробую.
А вообще расскажи, что ты хочешь от поисковика по локалке? как планируешь организовать индексирование и собственно сам поиск?
проще будет выбирать технологии, которые тебе есть смысл использовать. Структура и организация сети (если она не секретная) тоже может помочь.
Я бы делал поисковик так:
1. Индексирование
Для каждого ip в сети, пытался получить список ресурсов. Если ресурсы есть, индексирую их и сохраняю ip (и имя до кучи, если смогу определить) в список доступных машин (оптимизация а).
2. Поиск
Собственно поиск и определение доступна ли машина из списка машин, на котором найдены ресурсы.
При такой схеме, не нужно морочиться с получением списка всех доступных машин в сети при поиске. Это происходит на этапе индексирования, а оно может быть не завязано на gui и временные ограничения здесь не кретичны. Соответственно переиндексировать сеть через какой-то промежуток времени.
V>И еще одно. Непонятно почему socket->peerName(); в 3-ей функции не имя хоста, а его ИП
Я конечно не проверял, но думаю, что если ты будешь конектиться по имени к компу, то эта функция вернет имя машины. Если же ты конектишься по ip, то класс QSocket не будет определять для тебя имя, и эта функция вернет ip.
Здравствуйте, Stuw, Вы писали: S>Если в одно время запущено много потоков, то системе будет тяжко.
Согласен, наверное сделаю несколько потоков и каждый будет обрабатывать диапазон машин.
S>пинг чисто с помощью qt никак — http://lists.trolltech.com/qt-interest/2002-10/thread00351-0.html
Попробую реализовать с помощью исходнка из статейки, может получится.
S>Например, если попытка получить список расшареных ресурсов провалилась, считать комп отключенным. (ты же уже как-то получаешь список ресурсов?)
Ну, в принципе у меня если к компу не могу приконнектится, то он и так считается отключенным
S>А вообще расскажи, что ты хочешь от поисковика по локалке? как планируешь организовать индексирование и собственно сам поиск?
Для начала хотя бы просто вывести список компов и соответствующий список их ресурсов (если есть). Поиск и пр. пока в проект не входят
S>Для каждого ip в сети, пытался получить список ресурсов. Если ресурсы есть, индексирую их и сохраняю ip (и имя до кучи, если смогу определить) в список доступных машин (оптимизация а).
Так наверное и сделаю
S>Собственно поиск и определение доступна ли машина из списка машин, на котором найдены ресурсы.
Но я думаю в любом случае придется как минимум пинговать машины не из списка,т.к. может во время первой проверки машина просто была выключена.
V>>И еще одно. Непонятно почему socket->peerName(); в 3-ей функции не имя хоста, а его ИП
S>Я конечно не проверял, но думаю, что если ты будешь конектиться по имени к компу, то эта функция вернет имя машины. Если же ты конектишься по ip, то класс QSocket не будет определять для тебя имя, и эта функция вернет ip.
Наверное так и есть
Здравствуйте, vasilchmax, Вы писали:
V>Для начала хотя бы просто вывести список компов и соответствующий список их ресурсов (если есть). Поиск и пр. пока в проект не входят