Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виснет ClientSocket 
V
    Опции темы
bronenos
Дата 7.7.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Использую ClientSocket компонент по такой схеме
Форма загружается:
  SSocket->Active = true;
Функция посыла введенных данных:
  SSocket->Open();
  SSocket->Socket->SendText(...);
Функция обработки onRead
  response = Socket->ReceiveText();
  Socket->Close();
Форма закрывается
  SSocket->Active = false;

При таком порядке действий сообщение доходит каждый второй раз. Первый раз нажимаю на кнопку оно доходит, второй раз нет, третий раз доходит, четвертый нет и так далее. Что в моей схеме неправильно?
PM MAIL   Вверх
Klin
Дата 7.7.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
bronenos
Дата 8.7.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да я просто дважды видно кнопку нажал случайно, а там я не нашел ответа на проблему
PM MAIL   Вверх
Ak47black
Дата 8.7.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



bronenos, учти что сообшешения могут склеиваться при TCP.
Это происходит когда посылаешь очень часто один за другим пакетом. (Может конечно у тебя такое и небыть)
Тебе надо пометить на блоки и парсить все что приходит если ты будешь серьозно этим заниматься.

Это сообщение отредактировал(а) Ak47black - 8.7.2007, 13:52
PM MAIL   Вверх
bronenos
Дата 8.7.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот попробуйте войти
Ник tester
Пасс test

http://phx.freedomf.net/c_chat/chat.exe
и отправить сообщение
первое отправит, второе нет, 3 да, 4 нет и так далее... вот в чем трабла
запросы раюотают через раз

(насчет неизвестных ошибок это остаток от дебага, скор уберу)

Это сообщение отредактировал(а) bronenos - 8.7.2007, 14:36
PM MAIL   Вверх
bronenos
Дата 8.7.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо, проблема была в том, что я отправлял данные, когда сокет еще не соединился
PM MAIL   Вверх
Klin
Дата 9.7.2007, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bronenos @  8.7.2007,  14:00 Найти цитируемый пост)
а там я не нашел ответа на проблему

Я хотел чтобы вы посмотрели на последовательность действий. Но рад, что вы сами нашли решение, действительно рад. К сожалению, сейчас пошла плохая тенденция, у многих программистов есть возможность, чтобы самим найти ответ, но думать что-то не хотят smile


ps. отметьте вопрос решенным.


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
bronenos
Дата 9.7.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



однако вторая проблема))
после подавления ошибки и вывода информации о ней (случаются теперь асинхронные ошибки) сокет перестает работать - открытие / закрытие не помогают... че делать?
PM MAIL   Вверх
bronenos
Дата 9.7.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile как восстанавливать сокет после ошибки?  smile 
PM MAIL   Вверх
Ak47black
Дата 9.7.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



bronenos, надо онулировать его в процедуре обработки ошибок OnError, тоесть к переменной номера ошибки приравнять 0. 
Код

  ErrorCode = 0;

bronenos, по моему ты неправильно задаешь вопросы, мы тут не телепаты чтобы всё угадывать, выкладывай код или тестовый проект и описывай точно.
И прочитай сначала доки.
PM MAIL   Вверх
bronenos
Дата 9.7.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



каждые 2 секунды делаю запрос
Код

void __fastcall TCForm::CSend(TObject *Sender, TCustomWinSocket *Socket)
{
  Timer->Enabled = false;
  CSocket->Socket->SendText((AnsiString)
    "GET /c_chat/chat.php?id=" + last + " HTTP/1.0" "\r\n"
    "Host: phx.freedomf.net"                        "\r\n"
    "\r\n"
  );
}


недавно начали появляться асинхронные ошибки сокета... я сделал их подавление (Socket.onError)
Код

void __fastcall TCForm::CError(TObject *Sender, TCustomWinSocket *Socket,
      TErrorEvent ErrorEvent, int &ErrorCode)
{
  ErrorCode = 0;
}


ошибка не выскакивает, но и больше сообщения не грузятся, то есть работа сокета останавливается. как можно восстановить его работу после Asynchronous socket error? я искал ответа на вопрос полтора дня - пока не нашел....

Это сообщение отредактировал(а) bronenos - 9.7.2007, 22:21
PM MAIL   Вверх
Ak47black
Дата 9.7.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



bronenos, ты чтото нето там с этими сокетами делаешь.
Никаких подавлений в этом случае недолжен ты вообще делать, это только при попытке неправильно подсоединиться делают. 
(Я в Си не силён.)
Ты вообще тут полный код выложи ато никто не ответит.
PM MAIL   Вверх
bronenos
Дата 10.7.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Полный код... я честно говоря не вижу в нем смысл... проблему я бы так сформулировал восстановление работоспособности сокета после Asynchronous Socket Error. Бывает, что случается ошибка во время запроса и страница не открывается, а через секунду все нормально. Вот видимо на такие моменты иногда попадает сокет и вылетает с ошибкой. Мне это надоело и я сделал подавление с попыткой CSocket->Close(); CSocket->Open(); его оживить, но не выходит.
Получается следующее.. после этой ошибки сокет перестает работать совсем, и мне эту работу надо восстановить чтоб сделать еще одну попытку запроса.
PM MAIL   Вверх
Ak47black
Дата 10.7.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

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



bronenos, чета я тогда непонимаю зачем ты закрываешь его если он даже небыл открыт в случае ошибки.
Сделай что-бы ошибка обнулировалась.
Если даже он такой глючиный там в Buildere (CSocket), тогда делай его в real time и в случае ошибки освобождай старый и создавай новый (компонент).

Цитата

Полный код...

Ну необязательно полный, сделай тестовый проект который отображает только ошибку.

Это сообщение отредактировал(а) Ak47black - 10.7.2007, 12:16
PM MAIL   Вверх
bronenos
Дата 10.7.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот что я делаю в случае ошибки (CSocket.onError)
Код

void __fastcall TCForm::CError(TObject *Sender, TCustomWinSocket *Socket,
      TErrorEvent ErrorEvent, int &ErrorCode)
{
  Area->Items->Add("Ошибка подключения");
  ErrorCode = 0;

  TClientSocket *CSocket;
  CSocket->Open();
}


А что надо делать, чтоб переменной CSocket присвоить новый сокет?
У меня получается, видимо, только локально его создать......

Это сообщение отредактировал(а) bronenos - 10.7.2007, 13:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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