Форум: "Сети";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
ВнизСокеты, Принятые файлы некорректны относительно исходных ?! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c