Проект с использованием Indy
Модератор: Модераторы
Проект с использованием Indy
Сделал проект с использованием Indy ( Windows ).
Служба с серверным компонентом + клиенты.
Так вот спустя какое-то время серверный компонент перестает принимать подключения от клиентов. При этом никакиих ошибок от серверного компонента Indy нет.
Я что-то не так делаю, или это Indy глючит?
Добавлено спустя 15 часов 53 минуты 51 секунду:
Никто не делал(ет) проекты с использованием Indy?
Служба с серверным компонентом + клиенты.
Так вот спустя какое-то время серверный компонент перестает принимать подключения от клиентов. При этом никакиих ошибок от серверного компонента Indy нет.
Я что-то не так делаю, или это Indy глючит?
Добавлено спустя 15 часов 53 минуты 51 секунду:
Никто не делал(ет) проекты с использованием Indy?
ты очень содержательно описываешь проблему - так что даже ткнуть пальцем некуда
Даже не знаю, что еще написать.
Не приводить же весь код серверной части...
Не приводить же весь код серверной части...
Если компонент indy, тем более "сервер" - то в любом случае используется отдельный поток. Возможно, вы неправильно обрабатываете исключение.
В каких случаях TIdTCPServer перестает принимать входящие подключения?
Свойство Active равно True, но входящие подключения перестают приниматься.
Свойство Active равно True, но входящие подключения перестают приниматься.
покажи что у тебя в TCPServer.OnExecute
Код: Выделить всё
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
Надо проверить слушается ли порт после отказа сервера команодй виндовс netstat
Возможно в компоненте есть таймаут отключения
Возможно некорректно идет процесс подключения клиентов
Попробуйте сделать на других компонентах , типа Sinapse
Выключите файрвол
Возможно в компоненте есть таймаут отключения
Возможно некорректно идет процесс подключения клиентов
Попробуйте сделать на других компонентах , типа Sinapse
Выключите файрвол
Файрвол выключен.
Заметил после чего происходит зависание - когда в обработчике
возникает ошибка, она обрабатывается в блоке
сообщения об возникшей ошибке идет в лог, и после этого происходит остановка приема входящих подключений.
Не понимаю почему это происходит, ведь ошибка обработалась корректно.
Заметил после чего происходит зависание - когда в обработчике
Код: Выделить всё
OnExecuteКод: Выделить всё
try
except
endсообщения об возникшей ошибке идет в лог, и после этого происходит остановка приема входящих подключений.
Не понимаю почему это происходит, ведь ошибка обработалась корректно.
Обработка ошибок в паре с обработкой сообщений может давать странные эффекты
Уберите вообще обработку исключений
Уберите вообще обработку исключений
Ism писал(а):Обработка ошибок в паре с обработкой сообщений может давать странные эффекты
Уберите вообще обработку исключений
Как же тогда обрабатывать ошибки?
Angel_19 писал(а):Как же тогда обрабатывать ошибки?
Сначала надо убедиться, что без обработки все работает
Возможно проблема в какойто функции, вызов которой вешает процедуру
Кстати без обработки ошибок какую ошибку выдает ?
В событии TCPServer.OnExecute я принимаю данные от клиента, тут же делаю что мне нобходимо, и отправляю клиенту данные.
Так вот пока я делаю, то что мне необходимо (как пример сохраняю данные в файл) может возникнуть ошибка, которую я стараюсь обработать.
Или вообще в TCPServer.OnExecute не обрабатывать ошибки и они будут генерироваться событием TCPServer.OnException ?
Так вот пока я делаю, то что мне необходимо (как пример сохраняю данные в файл) может возникнуть ошибка, которую я стараюсь обработать.
Или вообще в TCPServer.OnExecute не обрабатывать ошибки и они будут генерироваться событием TCPServer.OnException ?
Существование TCPServer.OnException как бы намекает , что не все так просто с обработкой ошибок
Сначала вам надо убрать обработку и посмотреть что будет
А вообще Indy вещь глючная, в свое время я от него отказался
Может это прокатит http://www.ararat.cz/synapse/doku.php/p ... :tcpserver
Сначала вам надо убрать обработку и посмотреть что будет
А вообще Indy вещь глючная, в свое время я от него отказался
Может это прокатит http://www.ararat.cz/synapse/doku.php/p ... :tcpserver
Не буду городить ветки, напишу здесь, сори.
Lazarus 1.6.2, Windows 7.
Наисал програмку ping используя из Indy компонент IdIcmpClient, по примерам из интернета.
Все, вроде бы работает, но под правами администратора.
Я в Indy ноль. Поэтому, прошу совета, может есть другой компонент для пинга, что бы не требовалось таких прав?
Lazarus 1.6.2, Windows 7.
Наисал програмку ping используя из Indy компонент IdIcmpClient, по примерам из интернета.
Все, вроде бы работает, но под правами администратора.
Я в Indy ноль. Поэтому, прошу совета, может есть другой компонент для пинга, что бы не требовалось таких прав?
