| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Подскажите со структурой, запутался с UDP.. |
| Автор: DelphiFun 11.11.2006, 20:51 | ||||
| Идея программы такая. На главном компьютере запускается программа "А". Параллельно запускаются копии программы "Б" на других компьютерах. Все "Б" коннектятся к главной "А". Работа заключается в том, что прога "А" будет рассылать что-то по всем "Б", т.е. все "Б" будут вести такую наблюдательную цель за "А". Со стороны "А" это может быть например рисование на "А" ( координаты раскидываются по всем "Б" ). Думаю идея понятна. Вот здесь и проблема. Программа "А" у меня в качестве сервера представлена компонентом TIdUDPServer Программа "Б" соответственно TIdUDPClient. Пытаюсь отправить строку из "A" по всем "Б" программа ( "Б" ) виснет напрочь. Отсылает "А" у меня так:
Получает "Б" так. Жму на кнопку принятия сообщений, выполняется следующий код:
( прога виснет ) Кликаю на "А" кнопку отправки ( код я привёл выше ) - прога не развисает и видимо сообщение так и не получает. Пробую на локальном хосте ( на одном компьютере ). Отправка в обратную сторону ( от клиента к серверу ) работает успешно. Где я напортачил? |
| Автор: DelphiFun 11.11.2006, 21:24 |
| Хотя структура приложений может быть здесь должна быть совсем другая? Но с другой стороны тогда какая, не большое же кол-во серверов и в качестве главной проги клиент с TidUDPClient... это же наверное нецелесообразно будет. Так как же сообщение тогда послать от сервера всем клиентам? |
| Автор: dumb 11.11.2006, 22:28 |
| 127.0.0.1 = localhost т.е. твой сервер(А) шлет udp-пакет самому себе. а в это время... все клиенты(Б) ждут пакет. не висят! ждут они. у ReceiveString есть необязательный параметр - таймаут приема в мсек. т.е. если ты напишешь IdUDPClient1.ReceiveString(1000), то через секунду клиент выйдет из этой функции и вернет пустую строку. клиенты(Б) должны сначала послать что-то серверу(А), чтобы он знал кому вообще рассылать хлам. т.е. сервер после запуска ждет входящие пакеты, из них выдергивает адреса и составляет список активных клиентов(активность подтверждается периодической посылкой от клиента какого-нибудь пакета, напр. слово ping). если клиент в течение опр.времени(таймаут пинга, напр. 10сек) не прислал ни одного пакета, то он идет в расход(удаляется из списка активных). ну а рассылка просто идет в цикле по этому списку. есть широковещательная рассылка, но она "далеко" не уходит... ps. погугли немного на тему сетевого обмена вообще, и udp в частности. |
| Автор: DelphiFun 12.11.2006, 00:41 | ||
| Спасибо за подробный ответ, многое прояснилось. Не понятно как отправляется широковещательный пакет всем клиентам с сервера. Если каждый клиент сидит на определённом IP адресе ( после того как клиенты что-то отправили серверу, который составил список активных клиентов ) мы же отправляем командой:
а здесь опять же указывается явно IP адрес получателя. Получается, что это уже и не широковещательный пакет? Ведь клиенты под другими адресами не получат этого сообщения? |
| Автор: DelphiFun 12.11.2006, 02:58 | ||
| Я должен перебрать? Или всмысле это компонент самостоятельно сделает? Я так понял после вызова:
компонент сам переберёт все активные IP адреса входящие в данный диапазон и разошлёт им сообщение. Так не получится? |
| Автор: dumb 12.11.2006, 15:39 | ||
| эм. у тебя есть два варианта решения: 1. перебор списка активных клиентов и отсылка каждому. 2. широковещательная рассылка. компонент, что в одном случае, что в другом, сам ничего не делает. перебирать тебе нужно самому, о чем уже говорилось:
а широковещательная рассылка - забота не твоя и не компонента: "сеть" сама разберется. |
| Автор: dumb 12.11.2006, 15:56 | ||
btw, в IdUDPxxx компонентах есть специальная функция для широковещательной рассылки:
|
| Автор: DelphiFun 13.11.2006, 01:37 |
| ух, круто! |
| Автор: DelphiFun 14.11.2006, 01:20 |
| Скажи, а если выбирать между двумя такими вариантами: 1. Широковещательная рассылка посредством TidUDPxxx компонент 2. TServerSocket/TClientSocket Циклическая рассылка от сервера по подключенным клиентам. Клиентов в среднем 15-25 компов. Данные текстовые, где-то ~ 900 б/с - 1кб/с Сеть локальная, 100 мбит/с. Данные идут в обе стороны. Реже, но со стороны клиента на сервер данные также поступают. Я просто подумываю о TServerSocket/TClientSocket и пытаюсь прикинуть насколько это будет целесообразным решение. |
| Автор: dumb 14.11.2006, 03:31 |
| если кол-во клиентов сопоставимо с кол-вом компов в сети, то, естественно, лучше использовать broadcast(широковещательную рассылку). в других случаях надо думать и считать - лучше к этому привлечь сисадмина. и чего это тебя "мотает" из стороны в сторону: то индейцы(Indy), то TxxxSocket'ы(Internet); то UDP, то TCP?... ты сделай для начала хоть как-нибудь(любой вариант реализуй). а потом уже посмотришь, как да что... ps. перечитал твой пост: ты чат что-ли делаешь? если да, то от broadcast'а лучше отказаться сразу. |
| Автор: DelphiFun 15.11.2006, 01:30 |
| Не, это не чат. Я тоже думаю реализовать сначала один хотя бы вариант, посмотреть как он себя будет "вести" в сети. Далее думаю виднее будет. Спасибо за советы и информацию, будем эксперементировать. |