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

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

передача файлов [D5, NT4, Win2k]


Akni ©   (2003-04-28 17:59:00) 

Добрый день, Мастера!

Передаю файл с пом. Сокет-компонентов в неблок. режиме.
Клиент посылает файл серверу таким образом:

Var fStream: TFileStream;
iSize: integer;
iCode: integer;
….

try
try
fStream:=TFileStream.Create(fName,fmOpenRead);
iSize:=fStream.size;

iCode:=cdFILE; //тип данных
fClientSocket.Socket.SendBuf(iCode, SizeOf(iCode));

fClientSocket.Socket.SendBuf(iSize, SizeOf(iSize)); //размер данных (файла)
fClientSocket.Socket.SendStream(fStream); //сам файл
except
on E:Exception do
begin
fLogStr:=E.Message;
Synchronize(WrLog);
PostMessage(fHandle,wm_RefreshClients,cdERROR,0);
end;
end;
finally
fStream.Free; // <----- здесь получаю AV
end;

Данные отправляются (и даже принимаются на сервере) в полном размере, но на строке fStream.Free получаю AV.
Подскажите, пожалуйста, в чем может быть дело?


$hade   (2003-04-29 10:59:00) [1]

хыы...ну я же говорил...:-)


Sheriff   (2003-04-29 10:47:00) [2]

Note: The Stream passed as a parameter to SendStream becomes “owned” by the windows socket object. The Windows socket object frees the stream when it is finished with it. Do not attempt to free the stream after it has been passed as a parameter.


$hade   (2003-04-29 08:39:00) [3]

а случаем
fClientSocket.Socket.SendStream(fStream);
не закрывает файл сам?
попробуй после этой строки сделать например
fStream.seek(0,0)...


Akni   (2003-04-28 18:27:00) [4]

1. Попробовала. Не помогло.

2. Попробовала еще такой вариант:

fStream:=TFileStream.Create(fName,fmOpenRead);
iSize:=fStream.size;

fStream.Free;

iCode:=cdFILE;
fClientSocket.Socket.SendBuf(iCode, SizeOf(iCode));
fClientSocket.Socket.SendBuf(iSize, SizeOf(iSize));
fClientSocket.Socket.SendStream(TFileStream.Create(fDat.fClientName,fmOpenRead));
это работает. Но, по-моему, «коряво» это как-то – создавать поток только для того, чтобы размер узнать, а потом еще один, чтобы сам файл послать.
Может, можно это как-то унифицировать?


Anatoly Podgoretsky   (2003-04-28 18:15:00) [5]

Для начала попробуй поместить fStream:=TFileStream.Create перед самым первым try


Наверх

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