Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите со структурой, запутался с UDP.. клиент виснет при получении сбщ от серва 
:(
    Опции темы
DelphiFun
Дата 11.11.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Идея программы такая. На главном компьютере запускается программа "А". Параллельно запускаются копии программы "Б" на других компьютерах.
Все "Б" коннектятся к главной "А".
Работа заключается в том, что прога "А" будет рассылать что-то по всем "Б", т.е. все "Б" будут вести такую наблюдательную цель за "А". Со стороны "А" это может быть например рисование на "А" ( координаты раскидываются по всем "Б" ).
Думаю идея понятна.
Вот здесь и проблема. Программа "А" у меня в качестве сервера представлена компонентом TIdUDPServer
Программа "Б" соответственно TIdUDPClient. 

Пытаюсь отправить строку из "A" по всем "Б" программа ( "Б" ) виснет напрочь.

Отсылает "А" у меня так:
Код
  IdUDPServer1.Send( '127.0.0.1', 21553, 'sdfds' );


Получает "Б" так. Жму на кнопку принятия сообщений, выполняется следующий код:
Код
  Memo1.Lines.Add ( IdUDPClient1.ReceiveString() );

( прога виснет )
Кликаю на "А" кнопку отправки ( код я привёл выше ) - прога не развисает и видимо сообщение так и не получает.

Пробую на локальном хосте ( на одном компьютере ). Отправка в обратную сторону ( от клиента к серверу ) работает успешно.

Где я напортачил?
PM MAIL   Вверх
DelphiFun
Дата 11.11.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Хотя структура приложений может быть здесь должна быть совсем другая?
Но с другой стороны тогда какая, не большое же кол-во серверов и в качестве главной проги клиент с TidUDPClient... это же наверное нецелесообразно будет. Так как же сообщение тогда послать от сервера всем клиентам?

Это сообщение отредактировал(а) DelphiFun - 11.11.2006, 21:24
PM MAIL   Вверх
dumb
Дата 11.11.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



127.0.0.1 = localhost
т.е. твой сервер(А) шлет udp-пакет самому себе. а в это время... все клиенты(Б) ждут пакет. не висят! ждут они.

у ReceiveString есть необязательный параметр - таймаут приема в мсек. т.е. если ты напишешь IdUDPClient1.ReceiveString(1000), то через секунду клиент выйдет из этой функции и вернет пустую строку.

клиенты(Б) должны сначала послать что-то серверу(А), чтобы он знал кому вообще рассылать хлам. т.е. сервер после запуска ждет входящие пакеты, из них выдергивает адреса и составляет список активных клиентов(активность подтверждается периодической посылкой от клиента какого-нибудь пакета, напр. слово ping). если клиент в течение опр.времени(таймаут пинга, напр. 10сек) не прислал ни одного пакета, то он идет в расход(удаляется из списка активных).
ну а рассылка просто идет в цикле по этому списку. есть широковещательная рассылка, но она "далеко" не уходит...

ps. погугли немного на тему сетевого обмена вообще, и udp в частности.
PM MAIL   Вверх
DelphiFun
Дата 12.11.2006, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Спасибо за подробный ответ, многое прояснилось.
Не понятно как отправляется широковещательный пакет всем клиентам с сервера. Если каждый клиент сидит на определённом IP адресе ( после того как клиенты что-то отправили серверу, который составил список активных клиентов ) мы же отправляем командой:
Код
IdUDPServer1.Send( '127.0.0.1', 21553, 'sdfds' );

а здесь опять же указывается явно IP адрес получателя. Получается, что это уже и не широковещательный пакет? Ведь клиенты под другими адресами не получат этого сообщения?
PM MAIL   Вверх
dumb
Дата 12.11.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



Цитата(DelphiFun @  12.11.2006,  00:41 Найти цитируемый пост)
Не понятно как отправляется широковещательный пакет всем клиентам с сервера.

Код

IdUDPServer1.Send( '255.255.255.255', 21553, 'sdfds' );

но это дело, как правило, работает только в пределах локальной сети, т.е. дальше широковещательные пакеты не пускают. опять же, если инфы сервер раздавать будет много, то это довольно ощутимая нагрузка на сеть... такие пакеты используются в основном для поиска "своих".

Цитата(DelphiFun @  12.11.2006,  00:41 Найти цитируемый пост)
а здесь опять же указывается явно IP адрес получателя. Получается, что это уже и не широковещательный пакет? Ведь клиенты под другими адресами не получат этого сообщения? 

естественно. ты должен "перебрать" всех клиентов в цикле.
for ... do Send(IPlist[i]...
PM MAIL   Вверх
DelphiFun
Дата 12.11.2006, 02:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Я должен перебрать? smile
Или всмысле это компонент самостоятельно сделает?
Я так понял после вызова:
Код
IdUDPServer1.Send( '255.255.255.255', 21553, 'sdfds' );

компонент сам переберёт все активные IP адреса входящие в данный диапазон и разошлёт им сообщение. Так не получится?
PM MAIL   Вверх
dumb
Дата 12.11.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



эм. у тебя есть два варианта решения:
1. перебор списка активных клиентов и отсылка каждому.
2. широковещательная рассылка.

компонент, что в одном случае, что в другом, сам ничего не делает. перебирать тебе нужно самому, о чем уже говорилось:
Цитата(dumb @  12.11.2006,  01:13 Найти цитируемый пост)
естественно. ты должен "перебрать" всех клиентов в цикле.
for ... do Send(IPlist[i]... 


а широковещательная рассылка - забота не твоя и не компонента: "сеть" сама разберется.
PM MAIL   Вверх
dumb
Дата 12.11.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



btw, в IdUDPxxx компонентах есть специальная функция для широковещательной рассылки:
Цитата(F1)

procedure Broadcast(const AData: string; const APort: integer);
Parameters
  const AData: string
  Values to send in the datagram.
const APort: integer
  Port number for the transmission.

PM MAIL   Вверх
DelphiFun
Дата 13.11.2006, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



ух, круто! smile спасибо за инфу, буду разбираться далее.
PM MAIL   Вверх
DelphiFun
Дата 14.11.2006, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Скажи, а если выбирать между двумя такими вариантами:

1. Широковещательная рассылка посредством TidUDPxxx компонент

2. TServerSocket/TClientSocket
Циклическая рассылка от сервера по подключенным клиентам.

Клиентов в среднем 15-25 компов. Данные текстовые, где-то ~ 900 б/с - 1кб/с
Сеть локальная, 100 мбит/с.
Данные идут в обе стороны. Реже, но со стороны клиента на сервер данные также поступают.


Я просто подумываю о TServerSocket/TClientSocket и пытаюсь прикинуть насколько это будет целесообразным решение.
PM MAIL   Вверх
dumb
Дата 14.11.2006, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



если кол-во клиентов сопоставимо с кол-вом компов в сети, то, естественно, лучше использовать broadcast(широковещательную рассылку). в других случаях надо думать и считать - лучше к этому привлечь сисадмина.

и чего это тебя "мотает" из стороны в сторону: то индейцы(Indy), то TxxxSocket'ы(Internet); то UDP, то TCP?...

ты сделай для начала хоть как-нибудь(любой вариант реализуй). а потом уже посмотришь, как да что...

ps. перечитал твой пост: ты чат что-ли делаешь? если да, то от broadcast'а лучше отказаться сразу.
PM MAIL   Вверх
DelphiFun
Дата 15.11.2006, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет



Не, это не чат.
Я тоже думаю реализовать сначала один хотя бы вариант, посмотреть как он себя будет "вести" в сети. Далее думаю виднее будет.
Спасибо за советы и информацию, будем эксперементировать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.