Russian Qt Forum

Qt => Работа с сетью => Тема начата: Vladimir от Сентябрь 24, 2012, 14:53



Название: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 14:53
Доброго дня, форумчане) собственно вопрос: каким образом можно найти Сервер, не прибегая к широковещательным сообщениям?! В сети есть несколько компьютеров с IP 192.168.1.(1-254). Просто пытаясь в цикле перебрать допустимые адреса подключения не происходит.. сигнал connected() сокета не вызывается..
Код:
        QString findIP = ipAdressNetwork;
        QString partIP,partSubNet;
        int ind = findIP.lastIndexOf( '.' );
        partIP.append(findIP.left(ind)).append('.');

        for(int i = 1; i < 254; i++)
        {
           partIP.append(partSubNet.setNum(i,10));
           cltSockAWS.sockCommand->connectToHost(partIP, portCommandAWS);
           if (cltSockAWS.sockCommand->waitForConnected(1))
               return partIP;
           else
               partIP.remove((ind+1),partIP.length()-partSubNet.length());
        }


При такой реализации подключение происходит, но перебор IP ооочень медленный и программа просто перестает отвечать...
Может есть еще какие механизмы обнаружения Сервера, кроме широковещательных сообщений.. либо можно как-то доработать этот кусок кода! Подскажите)


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 24, 2012, 15:05
Кхм. А зачем находить сервер, позвольте вас спросить?


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 15:15
Кхм. А зачем находить сервер, позвольте вас спросить?

Потому что в сети будет несколько компьютеров и только один из них Сервер! Надо же знать к кому подключаться =) при чем любой из клиентов может захотеть стать Сервером (Главным компьютером), но если Сервер уже есть, значит запретить ему это сделать! Нужен механизм поиска Сервера..


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 24, 2012, 15:19
А почему UDP у вас вызывает отвращение? Это единственный думаю метод и наиболее простой :)

По одному перебирать IP - у вас клиент удалит программу раньше, чем  поиск закончится :)

Варианта на мой взгляд только 2 - либо широковещательный запрос на поиск сервера (сервер откликается и даёт свои координаты).

Или же сервер с периодичностью пуляет широковещательный пакет о своём месторасположении и следит, чтобы другие не рыпались.

PS если вы не прибегните к UDP, у вас с вероятностью 90% случится ситуация когда все клиенты станут серверами и не будут друг об друге знать. :)


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 15:33
Т.е. использование UDP самое правильное решение? А UDP датаграммы будут доходить до компьютеров в другой подсети, если таковые появятся?! И второе.. если на компьютерах по 2 сетевые карты, это не может быть проблемой??


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 24, 2012, 15:41
Не особый я специалист в данном вопросе, но:
Если сети подсоединены правильно (имба маршрутизатор иль тумбаЮмба компутерная), тогда датаграммы будут пересылаться из одной в другую и обратно.

Но если уверенности нет (как у меня), тогда следует отказаться от поиска сервера и тупо вбивать айпи по договоренности. Хотя хз хз .


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 15:48
Жестко забивать IP тоже нельзя, ибо любой компьютер в сети может стать Сервером, при его отсутствии.. и как-то его найти нужно!


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 24, 2012, 15:55
Смотри сам - если ты незнаешь, надо просмотреть все адреса сети  + адреса подсетей + адреса их подсетей + адреса подсетей подсетей подсетей.

Если UDP репитор отсутствует ( да простят мне сленг, аля оборудование, пересылающее UDP датаграммы в другие подсети), то UDP загнётся после 1 подсети.

Если же перебирать адреса сети  + адреса подсетей + адреса их подсетей + адреса подсетей подсетей подсетей, то я поседею раньше, чем это закончится :D

PS посмотри почитай, мб конечно и придумали что-то, но от кривизны рук человечьих вроде ничто не спасёт :D

PPS а что пишешь? корпоративный мессенджер или что-нить иное?


Название: Re: Поиск Сервера
Отправлено: fuCtor от Сентябрь 24, 2012, 17:38
Между сетями поиск может не заработать, вдруг запрещены шировещательные на стыке.
Как вариант сделать доп сервер, задача которого будет просто перенаправление клиента на сервер. Первый кто зарегистрировал себя как сервер им и становится, остальные при попытке занять его место должны получить ошибку/ответ о запрете. Подключающиеся клиенты будут получать нужный адрес, а дальше по старой схеме. При такой схеме сервером может быть кто угодно, но  будет 100% работать при любой архитектуре сети если есть линк между машинами, а в конфиге будет указан лишь адрес "маршрутизатора".


Название: Re: Поиск Сервера
Отправлено: V1KT0P от Сентябрь 24, 2012, 20:33
Жестко забивать IP тоже нельзя, ибо любой компьютер в сети может стать Сервером, при его отсутствии.. и как-то его найти нужно!
Я бы использовал примерно такой алгоритм:
1) Получение маски шлюза и составления списках всех ИП адресов подсети.
2) Используя асинхронную модель работы с сетью отослать сразу на все ИП адреса запросы.
3) Выждал бы таймаут и если никто не ответил(сервер или полу-сервер) то начал бы первый этап создания сервера(тут надо определить кто имеет приоритет для создания сервера, например по ип адресу или времени). На первом этапе прога становится полу-сервером и снова опрашивает не создались ли где еще полу-серверы или сервер. Если создан сервер, то отменяем и подключаемся к серверу, если пока искали сервер другие тоже-самое делали и в итоге создались несколько полу-серверов. Тут уже надо определить кто имеет приоритет, либо тот кто раньше вошел в режим полу-сервера, либо у того кто имеет наименьший ип адрес, либо у кого проц мощнее и памяти больше и т.д. Все полу-серверы как угодно договариваются, если например по ип адресу, то тут банально не приоритетные серверы сами отключаются узнав что есть приоритетный полу-сервер. И после этого полу-сервер становится сервером.
4) При получении запроса сервер должен отвечать что вот я сервер подключайся. Если же запрос получает полу-сервер, то он должен ответить мол погоди пару сек и повтори запрос(Но клиент должен повторить запрос только если не получил ответа от сервера).

Короче я как-то сумбурно расписал, но думаю мысль ясна. Тут важно то что если 10 клиентов сделают одновременно запросы и не обнаружат серверов, то если не разрулить ситуацию получишь 10 серверов и не одного клиента =).


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 24, 2012, 20:43
Виктор - только одна малая проблемка в твоей схеме :) одновременный запрос на ммм... примеру 3 подсети сразу будет определён антивирусом как зловредная активность :D И если он мониторит сеть, то казнь будет быстрой :D Например часовой бан компа или что хуже - призыв злых админов с отвёртками :D


Название: Re: Поиск Сервера
Отправлено: V1KT0P от Сентябрь 24, 2012, 20:48
Виктор - только одна малая проблемка в твоей схеме :) одновременный запрос на ммм... примеру 3 подсети сразу будет определён антивирусом как зловредная активность :D И если он мониторит сеть, то казнь будет быстрой :D Например часовой бан компа или что хуже - призыв злых админов с отвёртками :D
Ну дык это детали, если подумать то там еще проблемы могут возникнуть. Например сервер работает временно теряется с ним связь и новый клиент сканивший сеть не получает от него запрос и становится сервером. Или сервер выключают и серверу надо решить кому передать эстафету.
Но что-то мне начинает казаться что автору все это не надо и делает он игрушку по сети =).


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 20:58
Ушел с работы - не успел до конца объяснить) ну не совсем игрушка - военный радар)))
 
"Тут важно то что если 10 клиентов сделают одновременно запросы и не обнаружат серверов, то если не разрулить ситуацию получишь 10 серверов и не одного клиента =)"

такого получиться не может, ибо вход в программу осуществляется с авторизацией 3мя пользователями: Командир, Оператор, Штурман! И лишь Командир может быть сервером.. если его нет, то остальные просто ждут пока он появится.. как только он появился, они должны об этом узнать и к нему подключиться для дальнейшего обмена! Компьютеры подключаются в ХАБ, который может быть выключен.. тогда друг о друге вообще никто ничего не знает.. и могут авторизоваться 2 командира и скажем 2 оператора.. но при включении ХАБа это ситуация тоже должна в идеале разрулиться.. один из командиров становится сервером, для других клиентов.. а другой командир уведомляется, что в сети уже есть "главный"! Здесь конечно нужно разрулить кто из командиров главнее (по времени, кто первее, либо еще как-то), но это дело второе.. сейчас вопрос и задача, как ораганизовать поиск Командира?! Вроде как все компьютеры должны работать в одной подсети с IP 192.168.1.(1-254).. но это пока, потом могут условия и поменяться.. так что хотелось бы сделать что-то универсальное, с последующими минимальными переделками)


Название: Re: Поиск Сервера
Отправлено: kuzulis от Сентябрь 24, 2012, 22:37
Ушел с работы - не успел до конца объяснить) ну не совсем игрушка - военный радар)))

Ачумееть!!! Теперь, страна, ты можешь спать спокойно пока работают такие радары!

ППЦ.


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 24, 2012, 22:42
Мдец.



Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 22:51
а по делу?)


Название: Re: Поиск Сервера
Отправлено: V1KT0P от Сентябрь 24, 2012, 23:05
а по делу?)
Либо широковещательный UDP, либо сразу по паре сотен IP адресов в секунду по TCP. При чем можно сперва UDP, если не помогло то TCP. Вроде лучше без отдельного известного сервера не придумать.


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 23:08
а по делу?)
Либо широковещательный UDP, либо сразу по паре сотен IP адресов в секунду по TCP. При чем можно сперва UDP, если не помогло то TCP. Вроде лучше без отдельного известного сервера не придумать.

а как по TCP?! я в первом посте привел код.. но он не работает так как хотелось бы.. как именно осуществлять поиск по TCP?


Название: Re: Поиск Сервера
Отправлено: V1KT0P от Сентябрь 24, 2012, 23:12
а как по по TCP?! я в первом посте привел код.. но он не работает так как хотелось бы.. как именно осуществлять поиск по TCP?
Я же тебе в самом начале написал что надо асинхронные вызовы юзать. Отправляешь сразу всем ИП адресам в сети и ждешь ответ, если никто не отозвался значит и сервера нету.


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 23:19
Вы писали "1) Получение маски шлюза и составления списках всех ИП адресов подсети. 2) Используя асинхронную модель работы с сетью отослать сразу на все ИП адреса запросы." Можно по подробнее? Ну пусть с первым разберусь.. а как реализовать 2 пункт программно? В цикле писать connectToHost() дожидаясь ответа.. но как это сделать?


Название: Re: Поиск Сервера
Отправлено: V1KT0P от Сентябрь 24, 2012, 23:27
Можно по подробнее? Ну пусть с первым разберусь.. а как реализовать 2 пункт программно? В цикле писать connectToHost() дожидаясь ответа.. но как это сделать?
В цикле создаешь сокеты, добавляешь их в массив, делаешь коннект сигналов сокетов к слотам класса который будет обрабатывать результаты каждого сокета, для каждого сокета вызываешь коннект, запускаешь таймер. Если произошло соединение, то вызовется соответствующий слот, если никто не ответит сработает таймер в котором ты закроешь все сокеты. Что-то типа такого.


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 24, 2012, 23:37
вроде как понял.. буду пробовать! СПАСИБО!


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 25, 2012, 07:00
Извиняюсь за повторение - мдец :D

Идея интересная, а вот как он её реализовывать собрался...

А представьте примерно 800-900 компов с этой программой :D Вот и ботнет образовался, ДДОСящий :D


Название: Re: Поиск Сервера
Отправлено: V1KT0P от Сентябрь 25, 2012, 08:11
Извиняюсь за повторение - мдец :D

Идея интересная, а вот как он её реализовывать собрался...

А представьте примерно 800-900 компов с этой программой :D Вот и ботнет образовался, ДДОСящий :D
Как ты себе представляешь ДДОС одним пакетом на на один комп да еще с интервалов как минимум несколько минут.


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 25, 2012, 08:29
Не секрет для многих, что в сетях часто имеется сервер (да, да), который следит за соблюдением правил приличия. И зачастую он ещё оснащён антивирусом и иными фичами.

И когда комп в его подсети начинает, извиняюсь, испражнять пакеты во все стороны, это будет замечено, проанализировано и % 50 определено, что комп не в себе. Соответственно будет производиться лечение баном/сообщением админу/блокировкой :)

PS я не спорю, есть сети и без надсмотра. Но если я в своей сети(подключенная локалка с выходом в глобалку) захреначу 900 одновременных запросов на все IP - мне как минимум придёт предупреждение от провайдера и/или блокировка минут на 15 :)

PPS кстати помоему этот принцип черви используют. Если резидент не ответил на запрос, то попытаться заразить комп :D


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 25, 2012, 10:37
Эм? Не надо меня так цитировать :) Я начинаю нервничать и писать неудобочитаемый код :)


Название: Re: Поиск Сервера
Отправлено: Vladimir от Сентябрь 25, 2012, 10:37
Не секрет для многих, что в сетях часто имеется сервер (да, да), который следит за соблюдением правил приличия. И зачастую он ещё оснащён антивирусом и иными фичами.

И когда комп в его подсети начинает, извиняюсь, испражнять пакеты во все стороны, это будет замечено, проанализировано и % 50 определено, что комп не в себе. Соответственно будет производиться лечение баном/сообщением админу/блокировкой :)

PS я не спорю, есть сети и без надсмотра. Но если я в своей сети(подключенная локалка с выходом в глобалку) захреначу 900 одновременных запросов на все IP - мне как минимум придёт предупреждение от провайдера и/или блокировка минут на 15 :)

PPS кстати помоему этот принцип черви используют. Если резидент не ответил на запрос, то попытаться заразить комп :D

Все это наверное правильно и хорошо, что Вы пишете, но для данной задачи этого не требуется.. ибо компьютеров предполагается от 2 до 10 и работать они будут под Linux)


Название: Re: Поиск Сервера
Отправлено: cutwater от Сентябрь 25, 2012, 12:24
Я может что-то пропустил. Но поясните, откуда вообще взялась идея делать такую децентрализованную архитектуру, в которой приходилось бы "искать сервер".


Название: Re: Поиск Сервера
Отправлено: Bepec от Сентябрь 25, 2012, 12:26
Если 2-10 под линуксом в одной подсети - UDP ваш выбор :) Просто, легко, элегантно.
Больше - уже централизовать надо :)

PS в фантазии автора она появилась. Видимо его не устроило сервер-клиентское приложение. Хочет скайнет/аля червяка намутить :D