Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623

TidTCPserver Как отправить сообщение всем?

24.07.2014, 14:40. Показов 3282. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разбираюсь в работе сокетов на примере банального чата, написал 2 приложения (клиент, сервер).
С клиента отправляю сообщение, сервер его принимает и тут же отдает обратно тому, кто его послал.
Но беда в том, что он отдает тому кто его послал, а как отдать всем ?
видил прошлые темы где говорилось о том, что в "Bindings->Items[]" есть все пиры, однако там только ип/порт, который слушает сервер...

Тогда я записал IP:PORT в TStringList
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
void __fastcall TForm1::SConnect(TIdContext *AContext)
{
    this->ListBox1->Items->Add("Connected: "+AContext->Binding->PeerIP+":"+AContext->Binding->PeerPort);
    clients_->Add(AContext->Binding->PeerIP+":"+AContext->Binding->PeerPort);
    this->Label2->Caption = clients_->Count;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::SDisconnect(TIdContext *AContext)
{
    this->ListBox1->Items->Add("Disconnected: "+AContext->Binding->PeerIP+":"+AContext->Binding->PeerPort);
    for (int i = 0; i < clients_->Count; i++)
    {
        if (clients_->Find(AContext->Binding->PeerIP+":"+AContext->Binding->PeerPort,i))
        {
            clients_->Delete(i);
            break;
        }
    }
    this->Label2->Caption = clients_->Count;
}
//---------------------------------------------------------------------------
а как теперь отправить всем?
Делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::SExecute(TIdContext *AContext)
{
    int len = AContext->Connection->Socket->ReadLongInt();
    WideString msg = AContext->Connection->Socket->ReadString(len);
    
    for (int i = 0; i < clients_->Count; i++)
    {
        TStringList *buff = new TStringList();
        buff->Delimiter = ':';
        buff->DelimitedText = clients_->operator [](i);
        WideString IP = buff->operator [](0);
        unsigned short PORT = StrToInt(buff->operator [](1));
        // ....
        delete buff;
    }
}
А вот как послать теперь на определенный IP:PORT я не могу найти...

+ при работе сервера заметил такой баг:
Если на сервере есть активные соединения (клиенты), то при попытки:
C++
1
2
this->S->StopListening();
this->S->Active = false;
приложение зависает и все...
но слушать порт перестает.

Добавлено через 14 часов 37 минут
Переписал под TServerSocket && TServerClient
Но теперь проблема другая:
С клиента было отправлено сообщение:
C++
1
if(this->Sock->Socket->Connected)   this->Sock->Socket->SendText(this->Edit3->Text);
А на сервере оно потерялось, вопрос куда ?
Сервер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::SockClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
    if (!Socket->ReceiveText().Trim().IsEmpty() && Socket->ReceiveText().Trim().Length() > 0)
    {
        this->ListBox1->Items->Add("Msg From: ["+Socket->RemoteAddress+":"+Socket->RemotePort+"] body: "+Socket->ReceiveText().Trim());
        for(int i = 0; i < Sock->Socket->ActiveConnections; i++)
        {
            if (Sock->Socket->Connections[i]->Connected != false)
                Sock->Socket->Connections[i]->SendText("["+Socket->RemoteAddress+"]: "+Socket->ReceiveText().Trim());
            else
                Sock->Socket->Connections[i]->Close(true);
        }
    }
}
Получилось так, что
C++
1
Socket->ReceiveText().Trim().Length() == 0
Событие произошло, а сообщение потерялось, куда ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2014, 14:40
Ответы с готовыми решениями:

Как через TidTCPServer TidTCPClient отправить сообщение
Как через TidTCPServer TidTCPClient отправить сообщение клиенту от сервера???? Я просто понять не могу почему у компонента Клиент есть...

Как отправить сообщение на email?
плиз дайте код для отправки сообщений на mail

Как отправить какое либо сообщение по WiFi
Доброго времени суток. Я подключон к сети WiFi мне как то нужно передать какое либо сообщение другому пользователю если у меня имееться: ...

4
91 / 91 / 22
Регистрация: 02.07.2013
Сообщений: 332
24.07.2014, 15:01
Лучший ответ Сообщение было отмечено Путин как решение

Решение

После того, как сделал Socket->ReceiveText(), то текст из буфера сокета уже считан. Следующее обращение вернёт пустую строку, всё правильно.
C++
1
2
3
4
WideString msg = Socket->ReceiveText().Trim();
if (!msg.IsEmpty() && msg.Length() > 0) // кстати, оба сравнения - это одно и то же
{
...
1
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
24.07.2014, 15:22  [ТС]
Выложу исходник, может начинающим поможет.
TServerSocket && TServerClient Эти компоненты находятся в "Internet", если их вдруг там не оказалось, то их надо установить:
Component -> Install Packages.
-> Add
-> C:\Program Files (x86)\Embarcadero\Studio\14.0\bin\dclsoc kets200.bpl
Пути могут разные, + последние 3 цифры "200" тоже могут быть другие в зависимости от версии.
Вложения
Тип файла: zip chat.zip (215.3 Кб, 19 просмотров)
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
24.07.2014, 15:29  [ТС]
поправил немног
Вложения
Тип файла: zip chat.zip (215.8 Кб, 31 просмотров)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.07.2014, 16:06
Цитата Сообщение от Путин Посмотреть сообщение
TidTCPserver
Как я помню, этот компонент создает потоки, и не во всех обработчиках можно так просто писать код...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2014, 16:06
Помогаю со студенческими работами здесь

Как отправить сообщение в окно через Handle
Как можно отправить запрос, а точнее сообщение другому окну, зная его HWND??? Добавлено через 46 секунд Вообще если я нажму на...

Как отправить сообщение по tcp протоколу без присоединения
Пользуюсь clientsocket но проблема в том что он не дает отправить сообщение пока не соединен с сервером.Подскажите как решить это проблему!

Как отправить команду с сервера на клиент с tidtcpserver?
Как отправить команду с сервера на конкретный клиент с tidtcpserver? Хочу узнать вариант и для 9 Indy, и для 10. В 9 было что-то...

Как получить информацию о друзьях из Facebook и отправить им всем сообщение
Всем привет. Нужно написать библиотеку которая предоставляет интерфейс позволяющий залогиниться юзеру на facebook, и получить список его...

Отправить сообщение всем пользователям
подскажите, пожалуйста. Такая вот задачка. Програма запускается, пользователь вводит сообщение, сообщение отправляется всем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru