Проект с использованием Indy

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проект с использованием Indy

Сообщение Angel_19 » 01.09.2014 17:08:41

Сделал проект с использованием Indy ( Windows ).
Служба с серверным компонентом + клиенты.

Так вот спустя какое-то время серверный компонент перестает принимать подключения от клиентов. При этом никакиих ошибок от серверного компонента Indy нет.

Я что-то не так делаю, или это Indy глючит?

Добавлено спустя 15 часов 53 минуты 51 секунду:
Никто не делал(ет) проекты с использованием Indy?
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение MaratIsk » 02.09.2014 14:34:39

ты очень содержательно описываешь проблему - так что даже ткнуть пальцем некуда
MaratIsk
новенький
 
Сообщения: 93
Зарегистрирован: 20.08.2009 18:15:20

Re: Проект с использованием Indy

Сообщение Angel_19 » 02.09.2014 14:52:56

Даже не знаю, что еще написать.
Не приводить же весь код серверной части...
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение wavebvg » 02.09.2014 15:58:03

Если компонент indy, тем более "сервер" - то в любом случае используется отдельный поток. Возможно, вы неправильно обрабатываете исключение.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Проект с использованием Indy

Сообщение Angel_19 » 04.09.2014 08:35:03

В каких случаях TIdTCPServer перестает принимать входящие подключения?
Свойство Active равно True, но входящие подключения перестают приниматься.
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение MaratIsk » 04.09.2014 09:57:29

покажи что у тебя в TCPServer.OnExecute
MaratIsk
новенький
 
Сообщения: 93
Зарегистрирован: 20.08.2009 18:15:20

Re: Проект с использованием Indy

Сообщение Angel_19 » 05.09.2014 11:19:15

Код: Выделить всё
procedure TDaemonInfo.IdTCPServerInfoExecute(AContext: TIdContext);
var
  LLine      : String;
  //bufLine    : String;
  tBufCMD    : TIdBytes;
  tCMD       : TCommandObmen;
  TSendNast  : TNastr;
  tBufData   : TMemoryStream;
  tSizeBuf   : TBufSizeData;
  tStringBuf : TStringList;
  tStringPr  : TStringList;
  tStringPrAllow: TStringList;
  tStatus    : TStatusUser;
  tStatusObm : TStatusObmen;
begin
    try
     {очищаем tCMD}
     tCMD.tCommand := 0;
     tCMD.tDate    := 0;
     tCMD.tTime    := 0;
     tCMD.tNamePC  := '';
     tCMD.tNameUser:= '';

     // принимаем размер комманды
     tSizeBuf := AContext.Connection.IOHandler.ReadInt64;
     if tSizeBuf <> SizeOf(tCMD) then
     begin
          AContext.Connection.IOHandler.Write(cIDError);
          AContext.Connection.Disconnect;
          AddLog(AContext.Connection.Socket.Binding.PeerIP+' Размер данных комманды неверен. Комманда не принимается! (принят размер) '+IntToStr(tSizeBuf)+' <> '+IntToStr(SizeOf(tCMD))+' (должен быть)');
          tCMD.tNamePC:= AContext.Connection.Socket.Binding.PeerIP;
          tCMD.tNameUser:= AContext.Connection.Socket.Binding.PeerIP;
          SendEMError('Размер данных комманды неверен. Комманда не принимается! (принят размер) '+IntToStr(tSizeBuf)+' <> '+IntToStr(SizeOf(tCMD))+' (должен быть)', tCMD);
          exit;
     end;
     // принимаем комманду
     AContext.Connection.IOHandler.ReadBytes(tBufCMD, tSizeBuf);
     BytesToRaw(tBufCMD, tCMD, tSizeBuf);
     if (FindInvalidUTF8Character(PChar(String(tCMD.tNameUser)), Length(tCMD.tNameUser)) <> -1) or
        (tCMD.tNameUser='') then
     begin
          AContext.Connection.IOHandler.Write(cIDError);
          AContext.Connection.Disconnect;
          AddLog(AContext.Connection.Socket.Binding.PeerIP+' Имя пользователя содержит испорченые данные. Комманда не принимается!');
          tCMD.tNamePC:= AContext.Connection.Socket.Binding.PeerIP;
          tCMD.tNameUser:= AContext.Connection.Socket.Binding.PeerIP;
          SendEMError('Имя пользователя содержит испорченые данные. Комманда не принимается!', tCMD);
          exit;
     end;
     if (FindInvalidUTF8Character(PChar(String(tCMD.tNamePC)), Length(tCMD.tNamePC)) <> -1) or
        (tCMD.tNamePC='') then
     begin
          AContext.Connection.IOHandler.Write(cIDError);
          AContext.Connection.Disconnect;
          AddLog(AContext.Connection.Socket.Binding.PeerIP+' Имя компьютера содержит испорченые данные. Комманда не принимается!');
          tCMD.tNamePC:= AContext.Connection.Socket.Binding.PeerIP;
          tCMD.tNameUser:= AContext.Connection.Socket.Binding.PeerIP;
          SendEMError('Имя компьютера содержит испорченые данные. Комманда не принимается!', tCMD);
          exit;
     end;
     vNastrINI.AddUser(tCMD.tNameUser);
     AddLog('Запрос: '+GetNameCMDServer(tCMD.tCommand), tCMD);
     AddLog('Кто запросил: "'+tCMD.tNameUser+'", на "'+tCMD.tNamePC+'", в '+TimeToStr(tCMD.tTime) + ' ' + DateToStr(tCMD.tDate), tCMD);
     // передаем статус
     AContext.Connection.IOHandler.Write(cIDOK);
     Case tCMD.tCommand of

    {cSet_Status_User} 4: begin
                            // принимаем статус пользователя
                            AddLOG('Принимаем данные о смене статуса пользователя:', tCMD);
                            tStatus := AContext.Connection.IOHandler.ReadInt64;
                            // сообщаем об успешном обмене
                            AContext.Connection.IOHandler.Write(cIDOK);
                            LLine := '';
                            LLine := GetNameFileStatus(vNastrINI.PathProcess, tCMD);
                            SaveStatus(tCMD, tStatus, LLine);
                            AddLog('Статус пользователя: '+GetOpisanieUserSatatus(tStatus), tCMD);
                       end;
     end;
    except
     on E: EIdConnClosedGracefully do
     begin
          // Connection Closed Gracefully.
          // Игнорируем это исключение
     end;
     // Возникла ошибка соединения
     on E: EIdException do
     begin
          try
          AContext.Connection.IOHandler.InputBuffer.Clear;
          AContext.Connection.Disconnect;
          except
          end;
          AddLog(AContext.Connection.Socket.Binding.PeerIP+' [ IdTCPServerInfoExecute ] Ошибка соединения: '+ E.Message);
          tCMD.tNamePC:= AContext.Connection.Socket.Binding.PeerIP;
          tCMD.tNameUser:= AContext.Connection.Socket.Binding.PeerIP;
          SendEMError('[ IdTCPServerInfoExecute ] Ошибка соединения: '+ E.Message, tCMD);
     end;
     on E: Exception do
     begin
        try
          AContext.Connection.IOHandler.InputBuffer.Clear;
          AContext.Connection.Disconnect;
        except
        end;
        AddLog(AContext.Connection.Socket.Binding.PeerIP+' [ IdTCPServerInfoExecute ] Ошибка: '+ E.Message);
        tCMD.tNamePC:= AContext.Connection.Socket.Binding.PeerIP;
        tCMD.tNameUser:= AContext.Connection.Socket.Binding.PeerIP;
        SendEMError('[ IdTCPServerInfoExecute ] Ошибка: ' + E.Message, tCMD);
     end;
    end;

end;


Добавлено спустя 2 минуты 31 секунду:
Также отлавливаю события и вывожу в лог:
OnException
OnListenException
OnStatus
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение Ism » 06.09.2014 11:05:54

Надо проверить слушается ли порт после отказа сервера команодй виндовс netstat
Возможно в компоненте есть таймаут отключения
Возможно некорректно идет процесс подключения клиентов
Попробуйте сделать на других компонентах , типа Sinapse
Выключите файрвол
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Проект с использованием Indy

Сообщение Angel_19 » 09.09.2014 09:04:35

Файрвол выключен.
Заметил после чего происходит зависание - когда в обработчике
Код: Выделить всё
OnExecute
возникает ошибка, она обрабатывается в блоке
Код: Выделить всё
try

except
end

сообщения об возникшей ошибке идет в лог, и после этого происходит остановка приема входящих подключений.
Не понимаю почему это происходит, ведь ошибка обработалась корректно.
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение Ism » 09.09.2014 13:19:15

Обработка ошибок в паре с обработкой сообщений может давать странные эффекты
Уберите вообще обработку исключений
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Проект с использованием Indy

Сообщение Angel_19 » 09.09.2014 14:37:31

Ism писал(а):Обработка ошибок в паре с обработкой сообщений может давать странные эффекты
Уберите вообще обработку исключений


Как же тогда обрабатывать ошибки?
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение Ism » 09.09.2014 14:52:43

Angel_19 писал(а):Как же тогда обрабатывать ошибки?

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

Кстати без обработки ошибок какую ошибку выдает ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Проект с использованием Indy

Сообщение Angel_19 » 09.09.2014 14:59:56

В событии TCPServer.OnExecute я принимаю данные от клиента, тут же делаю что мне нобходимо, и отправляю клиенту данные.
Так вот пока я делаю, то что мне необходимо (как пример сохраняю данные в файл) может возникнуть ошибка, которую я стараюсь обработать.
Или вообще в TCPServer.OnExecute не обрабатывать ошибки и они будут генерироваться событием TCPServer.OnException ?
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Проект с использованием Indy

Сообщение Ism » 09.09.2014 16:11:10

Существование TCPServer.OnException как бы намекает , что не все так просто с обработкой ошибок
Сначала вам надо убрать обработку и посмотреть что будет

А вообще Indy вещь глючная, в свое время я от него отказался
Может это прокатит http://www.ararat.cz/synapse/doku.php/p ... :tcpserver
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Проект с использованием Indy

Сообщение Ustas » 12.01.2017 10:53:43

Не буду городить ветки, напишу здесь, сори.
Lazarus 1.6.2, Windows 7.
Наисал програмку ping используя из Indy компонент IdIcmpClient, по примерам из интернета.
Все, вроде бы работает, но под правами администратора.
Я в Indy ноль. Поэтому, прошу совета, может есть другой компонент для пинга, что бы не требовалось таких прав?
Ustas
постоялец
 
Сообщения: 146
Зарегистрирован: 19.10.2009 14:58:10
Откуда: г.Муром

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 17

Рейтинг@Mail.ru