|
|
Регистрация | << Правила форума >> | 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.
Изучи досконально коды этих методов. |