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

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

Сокеты, Принятые файлы некорректны относительно исходных ?! [D5, Win2k]


Alena ©   (2004-08-22 16:35:00) 

Использую сокеты для передачи файлов с помощью: на серваке-SendStream(S), на клиенте-в память, затем блоки в файл. С маленькими файлами и простыми текстовыми проблемм нет, а вот большие по объему 5-50 Мб (bmp,avi,xls,doc,cdr...) приложения открывают некорректно (нарушается форматирование в doc, либо возникают пробелы в графических файлах, а то и вовсе не открываются... Объем принятых файлов больще чем исходных! Кто сталкивался с такой проблемой ? Подскажите как корректно передать-принять !


Alena   (2004-08-24 10:10:00) [1]

Буду разбираться, чтобы обезопасить приложение от таких "подводных камней". Приятно осозновать, что есть грамотные люди готовые направить в нужное русло!!! Еще раз СПАСИБО.


Digitman   (2004-08-24 09:45:00) [2]


> Alena   (24.08.04 09:26) [7]


заметь, что эти грабли ты миновала бы и самостоятельно, если бы внимательно вчиталачь в справку к методу ReceiveLength()

цитата:

Note: ReceiveLength is not guaranteed to be accurate for streaming socket connections.

это должно было зародить сомнения в правильности первоначального твоего (ошибочного) варианта

...

а далее тебя могут ожидать еще одни грабли - событие OnClientRead на серверной стороне может возникнуть более одного раза в ответ на ClientSocket1.Socket.SendText(ComboBox1.Text), в результате чего возможен вариант, когда строка TFileStream.Create(Socket.ReceiveText,fmOpenRead) возбудит неоднократное исключение по ошибке поиска файла


Alena   (2004-08-24 09:26:00) [3]

Все получилось, спасибо Digitman ©!
Контроль показал, что приемные блоки в самом деле меньше (передается 8192, а реально принимается в ряде случаев = 4456,4096,6976,3736.... каждый раз по разному. Функция ReceiveBuf() - полезная !!!


Digitman   (2004-08-23 14:55:00) [4]


> Alena   (23.08.04 14:24) [5]


правильно, в твоем случае могут быть и больше.

потому что не следует делать  

BlockWrite(f,Buf^, Length);

это неправильно

вместо Lengthследует передавать то значение, что вернул метод  ReceiveBuf() ... бросай все и читай внимательно справку к методу !


Alena   (2004-08-23 14:24:00) [5]

Нет написано верно. Полученные файлы больше по объему и искажены ! Причину хочу выяснить.


Verg   (2004-08-23 08:56:00) [6]


> Объем принятых файлов больще чем исходных!


Может все же наоборот?


Alena   (2004-08-23 08:31:00) [7]

Код стандартный:
procedure TForm1.Button2Click(Sender: TObject);
begin
IsRecStart:=True;
ClientSocket1.Socket.SendText(ComboBox1.Text)
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
Buf:^Byte;
Length:Integer;
f:File;
begin
 Timer1.Enabled:=False;
 Length:=Socket.ReceiveLength;
 GetMem(Buf,Length);
 Socket.ReceiveBuf(Buf^,Length);
 AssignFile(f,'c:\123\'+Combobox1.Text);
if IsRecStart then
begin
 Rewrite(f,1);
 IsRecStart:=False;
 end else begin
 Reset(f,1);
 Seek(f,FileSize(f));
end;
BlockWrite(f,Buf^,Length);
//Gauge1.Progress:=Gauge1.Progress+(Length div 3000);
 CloseFile(f);
FreeMem(Buf);
Timer1.Enabled:=True;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 Stream:TFileStream;
begin
Stream:=TFileStream.Create(Socket.ReceiveText,fmOpenRead);
Socket.SendStream(Stream);
end;



Как посчитать правильно колличество байт, если можно поправьте мой код.


Verg   (2004-08-22 23:33:00) [8]

Посмотри здесь, может пригодится

http://webfile.ru/43313


False_Delirium   (2004-08-22 18:40:00) [9]

Посылаешь или считываешь не достаточное кол-во байт, при каждой порции посыла - приёма.

Если нет - код?


Наверх

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