powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ Builder ф-ция OnClientRead, как она работает?
5 сообщений из 5, страница 1 из 1
C++ Builder ф-ция OnClientRead, как она работает?
    #34328937
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток...

Начал разбираться с C++ Builder и наступил на грабли... Никак не пойму как работает ф-ция OnClientRead компанента TServerSocket...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TMainForm::SS1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
 int kol_sim;
 kol_sim = Socket->ReceiveLength();
 MainForm->Memo1->Lines->Add("From : " + Socket->RemoteAddress + "Size : " + IntToStr(kol_sim));
}

Непонимание заключается в том, что если изменить код на :

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TMainForm::SS1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
 MainForm->Memo1->Lines->Add("Resend data : " + Socket->ReceiveText());
}

То при каждой передаче данных в Мемо выводится сообщение, переданное клиентом...

В первом же случае, процедура обрабатывается один раз, выводит на экран адрес и размер первого сообщения, хотя клиент посылает еще сообщения...

Вопрос заключается в следующем : Почему когда в Мемо записывается само сообщение, при каждой посылке данных клиентом процедура срабатывает, а если в Мемо добавлять строку "From : " + Socket->RemoteAddress + "Size : " + IntToStr(kol_sim)" Процедура обрабатывается один раз?
...
Рейтинг: 0 / 0
C++ Builder ф-ция OnClientRead, как она работает?
    #34329045
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TMainForm::SS1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
 int kol_sim;
 kol_sim = Socket->ReceiveLength();
 MainForm->Memo1->Lines->Add("From : " + Socket->RemoteAddress + "Size : " + IntToStr(kol_sim));
}
Рискну предположить, что вот тут ты прочитал из канала только информацию о сообщении, а само сообщение осталось ждать пока его фактически прочитают Socket->ReceiveText(). Пока канал забит непрочитанным сообщением, события на приход новых не поступают. Это моё предположение т.к. последние 3 мес я только сокетами и занят.


Код: plaintext
1.
2.
3.
4.
void __fastcall TMainForm::SS1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
 MainForm->Memo1->Lines->Add("Resend data : " + Socket->ReceiveText());
}
А тут ты читаешь сообщение и освобождаешь канал для следующего. Поэтому событие на чтение возникает снова и снова по мере поступления следующих сообщений.

Вывод:
Всё, что послал изволь оприходовать, иначе дебет с кредитом не сойдётся
...
Рейтинг: 0 / 0
C++ Builder ф-ция OnClientRead, как она работает?
    #34329088
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Zmeishe спасибо :) что-то я не догадался :)

Вот еще одна проблема возникла, с тем же ридом...

На форме завел ClientSocket, в его свойстве, в случае успешного конекта с сервером, ServerSocket расположенный на моей форме делается активным... Порт сервера прослушивается и к нему подключаются клиенты, но почему то не срабатывают OnAccept и OnClientRead... В чем может быть причина?

Код: plaintext
1.
2.
3.
4.
5.
void __fastcall TMainForm::CS1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
     Memo1->Lines->Add("Connect to  " + Socket->RemoteHost + " correct...");
     SS1->Active = true;
}
...
Рейтинг: 0 / 0
C++ Builder ф-ция OnClientRead, как она работает?
    #34329152
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajПорт сервера прослушивается и к нему подключаются клиенты, но почему то не срабатывают OnAccept и OnClientRead...
Не знаю. Я свой socket сервер на Линуксе сделал. У меня только клиент на Win. И за 3 мес понял, что socket на Linux и socket на Win - они какие-то разные. Ведут себя не одинаково. Хотя, может это от релизации зависит C++Builder и Qt.
Может тебе это поможет:
на клиенте OnRead возникает только для асинхронного сокета. Для блокирующего его нет.
...
Рейтинг: 0 / 0
C++ Builder ф-ция OnClientRead, как она работает?
    #34330649
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, разобрался... В программе накосячил :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ Builder ф-ция OnClientRead, как она работает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]