-
Данные передаются партиями(я так понимаю), и что бы при передачи размера небыло лишнего сзади я ставлю #0. А чтобы небыло лишнего спереди я могу отсылать что-то вроде #start_file#
-
Как, всетаки, дописать к моему потоку, перед отправкой, #end_file#. Так ms.write(#end_file#,10) - что то не работает
-
> Данные передаются партиями(я так понимаю)
Неправильно понимаешь.
Данные передаются потоком.
-
Sergl © (01.11.07 12:57) [15] Попрошу без хамства... Че ты уперся в ms.write(#end_file#,10)? как ... на новые ворота... :) ms.write(PChar('#end_file#')^,10);
Sergl © (01.11.07 13:45) [20] Данные передаются партиями(я так понимаю) неправильно понимаешь... протокол поточный: т.е. один Send на другой стороне может разбится на несколько Recv и на оборот несколько Send могут слипнуться вызвав один Recv Отправив 10 "посылок" по Nбайт получатель получит от 1 "посылки" (размером N*10байт) до N*10 "посылок" (размером 1байт) причем каждый раз разного количества и размера :)
-
>Slym © Короче говоря тебе прийдется проверять сохранять все что тебе пришло в заранее подготовленном буфере(TMemoryStream подойдет)! Потом анализировать на нахождение нуля #0 в твоем буфере. Затем разбирать свой начало файла(его размер) и конец. Тебе выше объясняли, что TCP может прислать от 1 и до MaxBuf байт.(MaxBuf=8192 байт - хотя это тоже можно настроить! :) ). И вопрос нахрена тебе конец файла если ты посылаеш его длину? И зачем посылать текстовую длину файла, если можно заполнить структуру скажем: TFileRec=Record FileStart:String[10]; FileSize :Cardinal; ... End;
И проверять на наличие определенного(постоянного) размера данных в буфере приема? А то работа со строками это всегда гемор (по моему мнению)
-
Т.е.
... Data.Write(S,Length(s)); if not Reciving then begin // Теперь нам необходимо получить длину потока данных. SetLength(s, Data.Size); // +1 for the null terminator Data.Position:=0; Data.Read(s[1],Data.Size); _Size:=strlen(S)+1; StrLCopy(@sl[1], PChar(s), _Size); DataSize:= StrToInt(sl); Data:= TMemoryStream.Create;//это перенести в глобальный блок //здесь учесть что Data уже не пуст // Удаляем информацию о размере из данных. Delete(s, 1, Length(sl)); Reciving:= true; end;
|