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
|
Ну так тада и не надо ее показывать .
Суть в том, что ничего хитрого делать и не надо, все нормально работает.
Приведите свой код, тогда и будем искать что такое происходит.
|
|
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 соединений программа занимала тот-же объём в ОП.
|
|
Konstantine |
Отправлено: 25.10.2004, 09:21 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
люди, что? никто с этим не сталкивался???
|
|