![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Доброго времени суток. Как принять несколько файлов подрят зная их имена и размер. Сколько уже мучаюсь - не получается. С сервера идет инфа такая - имя_файла#размер#данные#имя_файла#размер#данные# т.е. подрят файлы. Нужно организовать прием с учетом того что пакеты сливаются.. Почему-то мой алгоритм не работает. Режим не блокирующий Заранее всем спасибо
|
|
#2
|
|||
|
|||
|
Севрер (отдает файлы по запросу)
Код:
begin
FName:=copy(TSockData(Sock.Data)^.Rec,1,TSockData(Sock.Data)^.LenRec-1);
Delete(TSockData(Sock.Data)^.Rec,1 ,TSockData(Sock.Data)^.LenRec);
TSockData(Sock.Data)^.LenRec:=0;
FGive:=true;
FStream:=TMemoryStream.Create;
FStream.LoadFromFile(FName);
FStream.Position:=0;
p:=FStream.Memory;
Form1.Memo1.Lines.Add('Отдаю '+FName);
m:=FName+'#'+IntToStr(FStream.Size)+'#';
Form1.Memo1.Lines.Add('Размер файла '+IntToStr(FStream.Size));
Sock.SendText(IntToStr(Length(m))+'#'+m);
i:=0;
SendFile;
end;
procedure TTHreadSock.SendFile;
begin
i:=Sock.SendBuf(p^, FStream.Size);
Form1.Memo1.Lines.Add('Отдали '+IntToStr(i));
{if i=FStream.Size then }
begin
FStream.Free;
FGive:=false;
Form1.Memo1.Lines.Add('Отдача завершена '+FName);
end;
end;и клиент(принимет запросившие файлы) Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
if lencom<>0 then
tmp:=Socket.ReceiveText
else tmp:=tmp+Socket.ReceiveText;
if not bool then
begin
if lencom=0 then begin
lencom:=strtoint(copy(tmp,1 , pos('#',tmp)-1));
delete(tmp,1 , pos('#',tmp));
Fname:= copy(tmp,1 , pos('#',tmp)-1);
delete(tmp,1 , pos('#',tmp));
FSize:= strtoint(copy(tmp,1 , pos('#',tmp)-1));
delete(tmp,1 , pos('#',tmp));
bool:=true;
buf:=TMemoryStream.Create;
buf.Position:=0;
end;
end else
end;вот поток который проверяет наличие пришедшего текста Код:
procedure TTt.Execute; begin Sleep(1000); if bool then Form1.wriiite; end; а вот запись файла в стрим Код:
procedure TForm1.wriiite;
begin
k:=FSize-buf.Size;
tt:=copy(tmp, 1, k);
delete(tmp,1 ,length(tt));
buf.Write(tt[1], length(tt));
if buf.Size=FSize then
begin
buf.Position:=0;
buf.SaveToFile(fname);
buf.Free;
bool:=false;
lencom:=0;
end;
end; |
|
#3
|
|||
|
|||
|
Цитата:
Потому и не работает что неблокирующий, а тебе этот факт по барабану - ты упорно не желаешь реагировать на результат выполнения функционального метода SendBuf() |
|
#4
|
|||
|
|||
|
Код:
i:=0; while not i=FStream do i:=i+Sock.SendBuf(p^, FStream.Size); так? если нет то как реагировать на эту функцию?? |
|
#5
|
|||
|
|||
|
Так как это делается в теле методов SendStream и SendStreamPiece.
Изучи досконально коды этих методов. |