![]() |
|
![]() ![]() ![]() |
|
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Долго пытался разобраться, но, ну никак, не получается. Разбираюсь в Indy 10, Builder 2007
Суть - есть сервер, есть клиенты. Клиенты приконнектились, и просто сидят ждут, когда сервер в ему угодное время отправит что-либо. Так вот. Как клиентом серверу сообщения посылать я понял, а вот как сервер клиенту должен послать я так и не понял. Большая просьба помчь строчкой кода ввиде примера. |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Client ----->>>>> "OK" Server ------->>>>> "NoOK" ====================== Сервер посылает в созданном потоке (при соединении с клиентом) ответ.... Это сообщение отредактировал(а) SVN74 - 29.3.2009, 00:03 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Допустим, я могу сразу ответить клиенту например так:
но как я смогу ответить вне функций ОнКоннект и ОнЭкзекьют, ведь там-то у меня не будет передаваемого *AContext? Ну в смысле, где в объекте TIdTCPServer хранятся указатели на подключенных клиентов? За ранее пасибо! |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Вот отдельное событие (отдельный поток)
==================================================== void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext) { try { Тут обслуживаем клиента, если надо сделаем задержку } __finally { AContext->Connection->Disconnect(); } } |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Как из функции Execute и других у объекта IdTCPServer сделать ответ клиенту я понял, ну а как это сделать скажем из функции Баттон1? Или ты хочешь сказать что это не возможно и нужно делать задержки в функции экзекьют? Это же такое геморрой ![]() Добавлено через 6 минут и 12 секунд Допустим в TcpServer's инфа о подключенных хранилась в TcpServer->Socket->Connections[index], неужели нет аналога у IdTCPServer? |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Да, нужно делать задержку для клиента, (правда, если количество клиентов не очень большое), а Button1 -> это общий ресурс, соответственно в потоке TForm1::IdTCPServer1Execute (через синхронизацию) просто надо отслеживать изменения состояния (к примеру) глобальной переменной и делать определенные выводы и причем это не затронет основной поток, и не будет видно ни каких задержек... |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Ладно, попытаюсь реализовать... хотя назвать это удобным, мегко говоря, не получается.
И еще вопрос - если допустим у меня 4и клиента находяцца на коннекте (из функции Экзекьют я уже вышел) и мне надо его отдесконектить, то как обраться именно к 3ему клиенту и скачать ему "пока"? Это сообщение отредактировал(а) CaLaT - 29.3.2009, 12:50 |
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Попробуй так:
=================== AContext->Connection[0].IOHandler->WriteLn("Bla, Bla"); =================== Можно еще так: ========================== IdTCPServer1->Bindings->Items[0]->Collection->Count; IdTCPServer1->Bindings->Items[0]->........ ========================== Надо пробовать всевозможные варианты... ================================================== Вообще лучше использовать WinSock (без гмр.) Это сообщение отредактировал(а) SVN74 - 29.3.2009, 17:51 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Пытался работать с этим в си и у меня не получается привести Server->Contexts->LockList()->Items[0] (void*) к типу TIdContext... есть мысли? Это сообщение отредактировал(а) CaLaT - 30.3.2009, 08:45 |
|||
|
||||
CaLaT |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Сделал так:
И вот только теперь я заметил что у объекта TIdTCPClient нет метода OnRead() или OnReceive(). Каким образом мне понять что сервер что-то засылает? пс: я надеюсь, для этого не потребуется в цикле проверять Добавлено через 3 минуты и 4 секунды Просьба не предлогать проверять в ручную, всё таки эта будет лишняя нагрузка, которая кленту не нужна |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
К сажелению событие ОнВорк несрабатывает... вообще никогда. Хотя если вручную проверить, то сообщение отправленное сервером на сокете есть.
Это сообщение отредактировал(а) CaLaT - 30.3.2009, 22:03 |
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Даже ОнСтатус возвращающий стринги с текущими действиями не реагирует на сообщения от сервера
|
|||
|
||||
SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
WinSock просто и надежно...
|
|||
|
||||
CaLaT |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 29.6.2008 Где: Город родной - Пи тер я твой! Репутация: нет Всего: нет |
Так и не нашёл...
Пришлось реализовать через tplower поток, который мониторит сокет на появление данных Еще вопрос: При передачи достаточно больших файлов, хотелось бы юзеру сообщать об общем ходе передачи на стороне клиента. Нашёл переменную - WriteBufferThreshhold , которая по идеи и должна возвращать желанное. Но получаю почему-то только -1. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |