Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 555

/ вопрос открыт /

Здравствуйте!
Есть
Код:

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;

if EChatIP.Text <> '' then begin
if EChatPort.Text <> '' then begin
ClientSocket1:=ClientSocket1.Create(nil);
ClientSocket1.Port:=1001;
ClientSocket1.Host:=EChatIP.Text;
ClientSocket1.OnRead:=ClientSocket1Read;
ClientSocket1.Active:=True;
ClientSocket1.Socket.SendText(DateTimeToStr(Now));
end;
end;
end;
Если долгое время (минут 40-50) не удается отослать на сервер
Код:

DateTimeToStr(Now)

то появляется ошибка следующего содержания:
Windows socket error: Невозможно выполнить операцию на сокете, т.к. буфер слишком мал или очередь

переполнена (10055), on API 'connect'

Из-за этой ошибки при выходе из программы система ненадолго зависает.
Как избежать этой ошибки (Windows socket error).

Shouldercannon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 23 марта 2009, 15:24
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Пупкин В В

Здравствуйте, Shouldercannon!
По вашей логике при генерации ошибки на сокете вы шлете данные через созданный тот же сокет (в данном случае время).
На мой взгляд это не логично т.к. ошибки возникают чаше всего когда данные невозможно отослать.
Можно сделать систему когда данные отсылаются только раз и сокет ждет ответа не посылая больше ничего.
НО Главная ошибка сокеты то вы создаете а уничтожать то забываете. В целом немного бредовый код, может переработать логику.
в целом скорее всего забивается выходной буфер сокета и есть утечка памяти при создании сокетов.
начните например с добавления после if EChatPort.Text <> '' then begin
Socket.Free;

Ответ отправил: Пупкин В В (статус: 2-ой класс)
Время отправки: 23 марта 2009, 15:53


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 24 марта 2009, 18:23; участников в обсуждении: 2.
Shouldercannon

Shouldercannon (статус: Посетитель), 24 марта 2009, 14:23 [#1]:

Не помогло
Вадим К

Вадим К (статус: Академик), 24 марта 2009, 14:26 [#2]:

а как теперь у Вас выглядит код процедуры ClientSocket1Error?
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 24 марта 2009, 16:25 [#3]:

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;

if EChatIP.Text <> '' then begin
if EChatPort.Text <> '' then begin
Socket.Free;
ClientSocket1:=ClientSocket1.Create(nil);
ClientSocket1.Port:=1001;
ClientSocket1.Host:=EChatIP.Text;
ClientSocket1.OnRead:=ClientSocket1Read;
ClientSocket1.Active:=True;
ClientSocket1.Socket.SendText(DateTimeToStr(Now));
end;
end;
end;
Вадим К

Вадим К (статус: Академик), 24 марта 2009, 16:54 [#4]:

работоспособность такого кода даже не обсуждается. Он гарантировано нерабочий. А если и заработает, то это так, случайность.
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 24 марта 2009, 17:02 [#5]:

Зачем вы создаете компонентет в обработчике ошибки???
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 24 марта 2009, 18:11 [#6]:

Чтобы снова отослать на сервер команду
Вадим К

Вадим К (статус: Академик), 24 марта 2009, 18:23 [#7]:

во первых, нельзя так. во вторых, а кто удалит старый (а здесь главная засада - нельзя в обработчике события удалять компонент, который его породил). в третьих, не надо удалять компонент, который создала дефли. в четвёртых, если уж так грешите, а кто присвоит обработчик ошибок новому компоненту
и на последок. если произошла ошибка, то надо подумать, а почему она произошла. Вдруг физически провод вырван. и в этом случае отправить не получиться. И если ещё процедуру обработки ошибок вызывать , то всё дело зациклиться. Отсюдова и " очередь переполнена " - всего кода я то не вижу. а я уже представил, что там может быть.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 23 февраля 2020, 01:22
Выполнено за 0.03 сек.
Рейтинг@Mail.ru