Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема при работе с файлами и сетью одновременно [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]

приводит к исключению
Какому?


Наверх

Титульная страница Поиск, карта сайта Написать письмо