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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Поиск Сервера  (Прочитано 12002 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Сентябрь 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 ооочень медленный и программа просто перестает отвечать...
Может есть еще какие механизмы обнаружения Сервера, кроме широковещательных сообщений.. либо можно как-то доработать этот кусок кода! Подскажите)
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 24, 2012, 15:05 »

Кхм. А зачем находить сервер, позвольте вас спросить?
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #2 : Сентябрь 24, 2012, 15:15 »

Кхм. А зачем находить сервер, позвольте вас спросить?

Потому что в сети будет несколько компьютеров и только один из них Сервер! Надо же знать к кому подключаться =) при чем любой из клиентов может захотеть стать Сервером (Главным компьютером), но если Сервер уже есть, значит запретить ему это сделать! Нужен механизм поиска Сервера..
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 24, 2012, 15:19 »

А почему UDP у вас вызывает отвращение? Это единственный думаю метод и наиболее простой Улыбающийся

По одному перебирать IP - у вас клиент удалит программу раньше, чем  поиск закончится Улыбающийся

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

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

PS если вы не прибегните к UDP, у вас с вероятностью 90% случится ситуация когда все клиенты станут серверами и не будут друг об друге знать. Улыбающийся
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #4 : Сентябрь 24, 2012, 15:33 »

Т.е. использование UDP самое правильное решение? А UDP датаграммы будут доходить до компьютеров в другой подсети, если таковые появятся?! И второе.. если на компьютерах по 2 сетевые карты, это не может быть проблемой??
Записан
Bepec
Гость
« Ответ #5 : Сентябрь 24, 2012, 15:41 »

Не особый я специалист в данном вопросе, но:
Если сети подсоединены правильно (имба маршрутизатор иль тумбаЮмба компутерная), тогда датаграммы будут пересылаться из одной в другую и обратно.

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

Сообщений: 305



Просмотр профиля
« Ответ #6 : Сентябрь 24, 2012, 15:48 »

Жестко забивать IP тоже нельзя, ибо любой компьютер в сети может стать Сервером, при его отсутствии.. и как-то его найти нужно!
Записан
Bepec
Гость
« Ответ #7 : Сентябрь 24, 2012, 15:55 »

Смотри сам - если ты незнаешь, надо просмотреть все адреса сети  + адреса подсетей + адреса их подсетей + адреса подсетей подсетей подсетей.

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

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

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

PPS а что пишешь? корпоративный мессенджер или что-нить иное?
Записан
fuCtor
Гость
« Ответ #8 : Сентябрь 24, 2012, 17:38 »

Между сетями поиск может не заработать, вдруг запрещены шировещательные на стыке.
Как вариант сделать доп сервер, задача которого будет просто перенаправление клиента на сервер. Первый кто зарегистрировал себя как сервер им и становится, остальные при попытке занять его место должны получить ошибку/ответ о запрете. Подключающиеся клиенты будут получать нужный адрес, а дальше по старой схеме. При такой схеме сервером может быть кто угодно, но  будет 100% работать при любой архитектуре сети если есть линк между машинами, а в конфиге будет указан лишь адрес "маршрутизатора".
Записан
V1KT0P
Гость
« Ответ #9 : Сентябрь 24, 2012, 20:33 »

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

Короче я как-то сумбурно расписал, но думаю мысль ясна. Тут важно то что если 10 клиентов сделают одновременно запросы и не обнаружат серверов, то если не разрулить ситуацию получишь 10 серверов и не одного клиента =).
Записан
Bepec
Гость
« Ответ #10 : Сентябрь 24, 2012, 20:43 »

Виктор - только одна малая проблемка в твоей схеме Улыбающийся одновременный запрос на ммм... примеру 3 подсети сразу будет определён антивирусом как зловредная активность Веселый И если он мониторит сеть, то казнь будет быстрой Веселый Например часовой бан компа или что хуже - призыв злых админов с отвёртками Веселый
Записан
V1KT0P
Гость
« Ответ #11 : Сентябрь 24, 2012, 20:48 »

Виктор - только одна малая проблемка в твоей схеме Улыбающийся одновременный запрос на ммм... примеру 3 подсети сразу будет определён антивирусом как зловредная активность Веселый И если он мониторит сеть, то казнь будет быстрой Веселый Например часовой бан компа или что хуже - призыв злых админов с отвёртками Веселый
Ну дык это детали, если подумать то там еще проблемы могут возникнуть. Например сервер работает временно теряется с ним связь и новый клиент сканивший сеть не получает от него запрос и становится сервером. Или сервер выключают и серверу надо решить кому передать эстафету.
Но что-то мне начинает казаться что автору все это не надо и делает он игрушку по сети =).
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #12 : Сентябрь 24, 2012, 20:58 »

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Сентябрь 24, 2012, 22:37 »

Ушел с работы - не успел до конца объяснить) ну не совсем игрушка - военный радар)))

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

ППЦ.
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #14 : Сентябрь 24, 2012, 22:42 »

Мдец.

Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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