![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| DelphiFun |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Идея программы такая. На главном компьютере запускается программа "А". Параллельно запускаются копии программы "Б" на других компьютерах.
Все "Б" коннектятся к главной "А". Работа заключается в том, что прога "А" будет рассылать что-то по всем "Б", т.е. все "Б" будут вести такую наблюдательную цель за "А". Со стороны "А" это может быть например рисование на "А" ( координаты раскидываются по всем "Б" ). Думаю идея понятна. Вот здесь и проблема. Программа "А" у меня в качестве сервера представлена компонентом TIdUDPServer Программа "Б" соответственно TIdUDPClient. Пытаюсь отправить строку из "A" по всем "Б" программа ( "Б" ) виснет напрочь. Отсылает "А" у меня так:
Получает "Б" так. Жму на кнопку принятия сообщений, выполняется следующий код:
( прога виснет ) Кликаю на "А" кнопку отправки ( код я привёл выше ) - прога не развисает и видимо сообщение так и не получает. Пробую на локальном хосте ( на одном компьютере ). Отправка в обратную сторону ( от клиента к серверу ) работает успешно. Где я напортачил? |
||||
|
|||||
| DelphiFun |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Хотя структура приложений может быть здесь должна быть совсем другая?
Но с другой стороны тогда какая, не большое же кол-во серверов и в качестве главной проги клиент с TidUDPClient... это же наверное нецелесообразно будет. Так как же сообщение тогда послать от сервера всем клиентам? Это сообщение отредактировал(а) DelphiFun - 11.11.2006, 21:24 |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
127.0.0.1 = localhost
т.е. твой сервер(А) шлет udp-пакет самому себе. а в это время... все клиенты(Б) ждут пакет. не висят! ждут они. у ReceiveString есть необязательный параметр - таймаут приема в мсек. т.е. если ты напишешь IdUDPClient1.ReceiveString(1000), то через секунду клиент выйдет из этой функции и вернет пустую строку. клиенты(Б) должны сначала послать что-то серверу(А), чтобы он знал кому вообще рассылать хлам. т.е. сервер после запуска ждет входящие пакеты, из них выдергивает адреса и составляет список активных клиентов(активность подтверждается периодической посылкой от клиента какого-нибудь пакета, напр. слово ping). если клиент в течение опр.времени(таймаут пинга, напр. 10сек) не прислал ни одного пакета, то он идет в расход(удаляется из списка активных). ну а рассылка просто идет в цикле по этому списку. есть широковещательная рассылка, но она "далеко" не уходит... ps. погугли немного на тему сетевого обмена вообще, и udp в частности. |
|||
|
||||
| DelphiFun |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Спасибо за подробный ответ, многое прояснилось.
Не понятно как отправляется широковещательный пакет всем клиентам с сервера. Если каждый клиент сидит на определённом IP адресе ( после того как клиенты что-то отправили серверу, который составил список активных клиентов ) мы же отправляем командой:
а здесь опять же указывается явно IP адрес получателя. Получается, что это уже и не широковещательный пакет? Ведь клиенты под другими адресами не получат этого сообщения? |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
но это дело, как правило, работает только в пределах локальной сети, т.е. дальше широковещательные пакеты не пускают. опять же, если инфы сервер раздавать будет много, то это довольно ощутимая нагрузка на сеть... такие пакеты используются в основном для поиска "своих". естественно. ты должен "перебрать" всех клиентов в цикле. for ... do Send(IPlist[i]... |
||||
|
|||||
| DelphiFun |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Я должен перебрать?
Или всмысле это компонент самостоятельно сделает? Я так понял после вызова:
компонент сам переберёт все активные IP адреса входящие в данный диапазон и разошлёт им сообщение. Так не получится? |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
эм. у тебя есть два варианта решения:
1. перебор списка активных клиентов и отсылка каждому. 2. широковещательная рассылка. компонент, что в одном случае, что в другом, сам ничего не делает. перебирать тебе нужно самому, о чем уже говорилось:
а широковещательная рассылка - забота не твоя и не компонента: "сеть" сама разберется. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
btw, в IdUDPxxx компонентах есть специальная функция для широковещательной рассылки:
|
|||
|
||||
| DelphiFun |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
ух, круто!
|
|||
|
||||
| DelphiFun |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Скажи, а если выбирать между двумя такими вариантами:
1. Широковещательная рассылка посредством TidUDPxxx компонент 2. TServerSocket/TClientSocket Циклическая рассылка от сервера по подключенным клиентам. Клиентов в среднем 15-25 компов. Данные текстовые, где-то ~ 900 б/с - 1кб/с Сеть локальная, 100 мбит/с. Данные идут в обе стороны. Реже, но со стороны клиента на сервер данные также поступают. Я просто подумываю о TServerSocket/TClientSocket и пытаюсь прикинуть насколько это будет целесообразным решение. |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 5 Всего: 158 |
если кол-во клиентов сопоставимо с кол-вом компов в сети, то, естественно, лучше использовать broadcast(широковещательную рассылку). в других случаях надо думать и считать - лучше к этому привлечь сисадмина.
и чего это тебя "мотает" из стороны в сторону: то индейцы(Indy), то TxxxSocket'ы(Internet); то UDP, то TCP?... ты сделай для начала хоть как-нибудь(любой вариант реализуй). а потом уже посмотришь, как да что... ps. перечитал твой пост: ты чат что-ли делаешь? если да, то от broadcast'а лучше отказаться сразу. |
|||
|
||||
| DelphiFun |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 10.11.2006 Репутация: нет Всего: нет |
Не, это не чат.
Я тоже думаю реализовать сначала один хотя бы вариант, посмотреть как он себя будет "вести" в сети. Далее думаю виднее будет. Спасибо за советы и информацию, будем эксперементировать. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |