![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема при работе с файлами и сетью одновременно [D6, WinXP]
AngeL B. © (2003-01-04 14:54:00)Никто не встречал такой беды? Работаю с компонентами Indy. При подключении пользователя к программе необходимо записать информацию приходящую от него в файл. Если открыть файл в процессе соединения и записать туда данные, то первая же попытка отослать данные по сети приводит к исключению. Если данные в файл не писать, то все в порядке, но тогда не понятно, что делать с данными, так как пользователей может быть много, а делать специальную очередь для данных не очень хочется.
AngeL B. (2003-01-04 18:42:00) [1]Да все решил. Я же говорил что проблема не в файлах. Мне бы пришлось отсылать тебе такую кучу всего, причем это все многопоточное с критическими секциями, событиями, синхронизацией и т.д.
Проблема была в небольшой задержке, создаваемой функциями работы с файлами. В протоколе обмена оказалась маленькая разсогласованность и сервер закрывал соединение раньше чем клиент успевал отправить подтверждение приема (которого сервер не ждал) (а без файлов/задержки успевал). Вот и вся проблема.
Всем большое спасибо!
Sergey V. Sahdrin (2003-01-04 16:08:00) [2]а целиком отправить исходник проги? или хотя бы тех двух процедур?
Reindeer Moss Eater (2003-01-04 15:49:00) [3]unit LogUnit;
interface
procedure Log(const AMsg:string; const AParam:string = "");
implementation
uses SysUtils;
var LogName:string;
procedure Log(const AMsg : string; const AParam : string = "");
var F:Text;
begin
Assign(F,LogName);
try
if FileExists(LogName) then Append(F) else Rewrite(F);
Writeln(F,FormatDateTime("dd.mm.yyyy hh:mm:ss",Now),#9,AMsg,#9,AParam);
finally
Close(F);
end;
end;
initialization
LogName:=ChangeFileExt(ParamStr(0),".log");
end.
Reindeer Moss Eater (2003-01-04 15:48:00) [4]Надо не глубоко.
Надо часто.
AngeL B. (2003-01-04 15:44:00) [5]
2Reindeer Moss Eater
Да слышал. Трассировал уже, только недостаточно глубоко, видимо. Все равно спасибо.
Reindeer Moss Eater (2003-01-04 15:38:00) [6]Про трассировку слышал когда-нибудь? Попробуй.
У меня кофе кончился....
AngeL B. (2003-01-04 15:36:00) [7]Существует, и файл там создается. И данные туда записываются (если такой оператор вставить), только с сокетом после этого работать невозможно. :(
Reindeer Moss Eater (2003-01-04 15:19:00) [8]Путь d:\temp существует?
GetLastError существует? Что говорит?
AngeL B. (2003-01-04 15:17:00) [9]Ладно, видимо ошибка где-то не здесь. Дубу копать в глубь :)
AngeL B. (2003-01-04 15:14:00) [10]
> 2 Reindeer Moss Eater
Так то оно так. Но только если вставить в код следующие строки, то все перестает работать, хотя до этого работало.
AssignFile(F, "d:\temp\a.txt");
Rewrite(F);
CloseFile(F);
Reindeer Moss Eater (2003-01-04 15:10:00) [11]1. Indy ни разу не знает работаешь ли ты с файлами или нет.
2. Socket error # 10053: Software caused connection abort. Вызвано тем, что одна из сторон аварийно завершила работу и соединение прекращено.
AngeL B. (2003-01-04 15:08:00) [12]
> Перед передачей файл закрываешь?
Закрываю. Но какая разница.
Пробовал и через стандартные AssignFile/Rewrite/CloseFile и через TFileStream.
AngeL B. (2003-01-04 15:04:00) [13]Socket error # 10053: Software caused connection abort.
Кроме блока работы с файлами ничего больше в функции не делается.
Если ее вызов заремарить, то все чики-пуки. Данные получаются, выводятся на экран и т.д.
Sergey V. Sahdrin (2003-01-04 15:01:00) [14]Перед передачей файл закрываешь?
Reindeer Moss Eater (2003-01-04 14:56:00) [15]приводит к исключению
Какому?