Конференция "Сети" » Не пойму где ошибка(сокеты)...
 
  • Sergl © (01.11.07 13:45) [20]
    Данные передаются партиями(я так понимаю), и что бы при передачи размера небыло лишнего сзади я ставлю #0. А чтобы небыло лишнего спереди я могу отсылать что-то вроде #start_file#
  • Sergl © (01.11.07 13:51) [21]
    Как, всетаки, дописать к моему потоку, перед отправкой, #end_file#.
    Так ms.write(#end_file#,10)  - что то не работает
  • Сергей М. © (01.11.07 13:57) [22]

    > Данные передаются партиями(я так понимаю)


    Неправильно понимаешь.

    Данные передаются потоком.
  • Slym © (02.11.07 06:07) [23]
    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байт) причем каждый раз разного количества и размера :)
  • Prostoy_paren (06.11.07 12:57) [24]
    >Slym ©  
    Короче говоря тебе прийдется проверять сохранять все что тебе пришло в заранее подготовленном буфере(TMemoryStream подойдет)!
    Потом анализировать на нахождение нуля #0 в твоем буфере.
    Затем разбирать свой начало файла(его размер) и конец.
    Тебе выше объясняли, что TCP может прислать от 1 и до MaxBuf байт.(MaxBuf=8192 байт - хотя это тоже можно настроить! :) ).
    И вопрос нахрена тебе конец файла если ты посылаеш его длину?
    И зачем посылать текстовую длину файла, если можно заполнить структуру скажем:
    TFileRec=Record
     FileStart:String[10];
     FileSize :Cardinal;
    ...
    End;

    И проверять на наличие определенного(постоянного) размера данных в буфере приема?
    А то работа со строками это всегда гемор (по моему мнению)
  • Prostoy_paren (06.11.07 13:26) [25]
    Т.е.

    ...
    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;
 
Конференция "Сети" » Не пойму где ошибка(сокеты)...
Есть новые Нет новых   [134431   +10][b:0][p:0]