C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
подключение через TServerSocket, из TClientSocket
Konstantine
Отправлено: 06.10.2004, 09:37


Мастер участка

Группа: Модератор
Сообщений: 545



есть прога — сервер, и есть клиент. клиент каждые 10 сек пытается присоединиться к серверу. если сервера нету — OnSocketError. этот эвент я гашу, но через 5 мин вылетает куча сообщений об ошибке Windows Socket.

кто-то мне сказал что каждый раз клиент открывает новый порт и не закрывает его. метод Close не помагает.

внимание вопрос — ЧТО ДЕЛАТЬ???
Gedeon
Отправлено: 06.10.2004, 11:53


Ветеран

Группа: Модератор
Сообщений: 1742



Делал я похожую штуку, вот код:
CODE

void __fastcall TF_MainForm::MainTimerTimer(TObject *Sender)
{
   if(!Connected){ // булева переменная, флаг
       Client->Active = true;  //  TClientSocket *Client;
       Connected = true;
       MainTimer->Enabled = false;
       TryConnect->Enabled = false; // это кнопочка для ручного соединения
   }
}
//---------------------------------------------------------------------------


CODE

void __fastcall TF_MainForm::ClientDisconnect(TObject *Sender,
     TCustomWinSocket *Socket)
{
   TryConnect->Enabled = true;
   Client->Active = false;
   Connected = false;
   MainTimer->Enabled = true;
}
//---------------------------------------------------------------------------


CODE

void __fastcall TF_MainForm::ClientError(TObject *Sender,
     TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
   if(ErrorCode==10061){
       if(ShowConnectonError){ // ошибка должна показываться 1 раз
           ShowMessage("Не удалось соединиться со сканирующим сервером, программа будет предпринимать попытки связаться далее.");

           ShowConnectonError = false;
       }
       TryConnect->Enabled = true;
       Client->Active = false;
       Connected = false;
       MainTimer->Enabled = true;
       ErrorCode = 0;
   }
}


Все это у меня прекрасно работает, если вываливаются какие-нить ошибки, то уж не поленитесь их написать.
AVC
Отправлено: 06.10.2004, 12:16


Ветеран

Группа: Модератор
Сообщений: 1583



2Konstantine
QUOTE

есть прога — сервер, и есть клиент. клиент каждые 10 сек пытается присоединиться к серверу. если сервера нету — OnSocketError. этот эвент я гашу, но через 5 мин вылетает куча сообщений об ошибке Windows Socket.

кто-то мне сказал что каждый раз клиент открывает новый порт и не закрывает его. метод Close не помагает.

Для связи клиент действительно каждый раз использует новый номер порта, но пусть вас это не пугает.
Не думаете ли вы что 30 вызовами (5мин через 10сек) вы перебрали все порты?
Метод Close помочь и не может — нельзя закрыть то что не открыто.

Ошибка в другом месте.
Konstantine
Отправлено: 06.10.2004, 15:44


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (Gedeon @ 06/10/2004, 12:55)
Делал я похожую штуку, вот код:
....
Все это у меня прекрасно работает, если вываливаются какие-нить ошибки, то уж не поленитесь их написать.

ниччё не понял... в чём суть?

и потом мне как раз не надо чтоб ошибка выводилась....
Gedeon
Отправлено: 06.10.2004, 16:31


Ветеран

Группа: Модератор
Сообщений: 1742



Ну так тада и не надо ее показывать biggrin.gif .
Суть в том, что ничего хитрого делать и не надо, все нормально работает.

Приведите свой код, тогда и будем искать что такое происходит.
Konstantine
Отправлено: 07.10.2004, 09:35


Мастер участка

Группа: Модератор
Сообщений: 545



прикол в том что из-за неправильно поставленных условий алгоритма попытка соединения происходило группами по 10 раз каждые 10 сек.
но прикол не в этом. после каждой попытки требуемая память (см. диспечер задач) увеличивается на ~4кБайт за 7 попыток.

вот привожу упрощённый код... для упрощения и быстрого наблюдения таймер стоит на 10 мс.(увеличение до 1 сек ни к чему лучшему не приводит)

результат — на Windows ХР — после 3974 (!) попыток выдаёт:
-- из-под билдера — "access violation .... write of address 0x00030efc" и предлагает процессорную отладку
-- самостоятельно запущенное приложение — просто "Stack overflow"

проверял на Virtual PC с Windows 98 (rus, не SE) — после 240 попыток после каждой попытки выводит "Windows socket error: 10055 on API 'connect' "
причём изменение ОЗУ никакого эффекта не даёт.

как сделать так, чтоб даже после 100000 соединений программа занимала тот-же объём в ОП.

User Attached Image Скачать файл
SimpleClient.zip


Konstantine
Отправлено: 25.10.2004, 09:21


Мастер участка

Группа: Модератор
Сообщений: 545



люди, что? никто с этим не сталкивался???

Вернуться в Вопросы программирования в C++Builder