Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Сокеты, Принятые файлы некорректны относительно исходных ?!   Найти похожие ветки 

 
Alena   (2004-08-22 16:35) [0]

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


 
False_Delirium ©   (2004-08-22 18:40) [1]

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

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


 
Verg ©   (2004-08-22 23:33) [2]

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

http://webfile.ru/43313


 
Alena   (2004-08-23 08:31) [3]

Код стандартный:
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-23 08:56) [4]


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


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


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

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


 
Digitman ©   (2004-08-23 14:55) [6]


> Alena   (23.08.04 14:24) [5]


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

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

BlockWrite(f,Buf^,Length);

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

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


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

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


 
Digitman ©   (2004-08-24 09:45) [8]


> 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 10:10) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.09 c
8-1091525797
Андрей Валенинов
2004-08-03 13:36
2004.10.31
Помогите с картинкой


14-1097296494
Stef
2004-10-09 08:34
2004.10.31
Метод Брезенхема. Прямой доступ к видео памяти.


14-1097481073
panov
2004-10-11 11:51
2004.10.31
/OffTopic/


14-1097254280
begin...end
2004-10-08 20:51
2004.10.31
Вычислительная математика: литература


3-1096975889
Yagovdik
2004-10-05 15:31
2004.10.31
DBGrid и скроллер (мышиный)