![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Место на диске у конечного хоста при передачи данных
Nachinaushiy © (2006-02-21 14:05:00)Такой вопрос… вообщем есть куча клиентов которые отправляют на сервер большие объемы данных параллельно...
притом передачу могут вести параллельно несколько клиентов , но возникает проблема с сохранением данных если место на диске заканчивается… он пишет нулевые файлы а ексепшен не выдает… проверка свободного места на диске перед передачей ни чего не дает… так как чуть позднее после начала передачи клиентом может присоединиться второй клиент и начать отправлять данные на сервер.
Nachinaushiy (2006-02-21 14:39:00) [1]спасибо я понял
umbra (2006-02-21 14:34:00) [2]
> Но ексепшен почему то не работает(((((
потому что его никто не возбуждает. для методаFileStream.Writeнадо проверять, что он возвращает. Если что-то пошло не так, то он вернет 0
Nachinaushiy (2006-02-21 14:19:00) [3]
> RO (21.02.06 14:10) [1]
> Приводи код сервера и код клиента.
код клиента и код сервера очень большой и весь на классах... слижком много приводить можно только данную часть:
CreateDir(Config.IncomingPath+IntToStr(aTaskQuery.TaskId));
aFileStream := TFileStream.Create(Config.IncomingPath+IntToStr(aTaskQuery.TaskId)+'\'+aTaskQuer y.FileName, fmCreate);
aPosition := 0;
aExit := False;
while not aExit do
begin
if (aTaskQuery.DataSize - aPosition) < CONST_DATA_SENDBUFFER_SIZE then
begin
aBufSize := aTaskQuery.DataSize - aPosition;
end else
begin
aBufSize := CONST_DATA_SENDBUFFER_SIZE;
end;
try
AThread.Connection.ReadBuffer(aBuffer, aBufSize);
except
on E: Exception do
begin
DoOnTransportStringMessage('Error S032: Клиент: "'+TSimpleClient(AThread.Data).FNodeName+'". Ошибка приема данных с клиента: ' + E.Message);
exit;
end;
end;
try
aPosition := aPosition + aBufSize;
aFileStream.Write(aBuffer, aBufSize);
except
on E: Exception do
begin
DoOnTransportStringMessage('Error S033: Клиент: "'+TSimpleClient(AThread.Data).FNodeName+'". Ошибка сохранения данных: ' + E.Message);
Exit;
end;
end;
//DoOnNotifyTransportData(aPosition, aTaskQuery.DataSize);
if aTaskQuery.DataSize <= aPosition then
begin
aExit := True;
end;
end;
> umbra © (21.02.06 14:11) [2]
> так и надо на сервере при подключении каждого клиента проверять
> доступное место на диске, вычитать зарезервированное уже
> подключившимися клиентами и если места боьше нет, то нового
> клиента отключать
Идея хорошая и приятная ... как сам не дошел) Спасибо
Но ексепшен почему то не работает(((((
umbra (2006-02-21 14:11:00) [4]так и надо на сервере при подключении каждого клиента проверять доступное место на диске, вычитать зарезервированное уже подключившимися клиентами и если места боьше нет, то нового клиента отключать
RO (2006-02-21 14:10:00) [5]Приводи код сервера и код клиента.