Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.08.2012, 08:59
xNeKiToSx xNeKiToSx вне форума
Прохожий
 
Регистрация: 23.01.2012
Сообщения: 10
Репутация: 10
По умолчанию Снова передача файлов через сокеты

Доброго времени суток. Как принять несколько файлов подрят зная их имена и размер. Сколько уже мучаюсь - не получается. С сервера идет инфа такая - имя_файла#размер#данные#имя_файла#размер#данные# т.е. подрят файлы. Нужно организовать прием с учетом того что пакеты сливаются.. Почему-то мой алгоритм не работает. Режим не блокирующий Заранее всем спасибо
Ответить с цитированием
  #2  
Старый 20.08.2012, 09:04
xNeKiToSx xNeKiToSx вне форума
Прохожий
 
Регистрация: 23.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Севрер (отдает файлы по запросу)
Код:
  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  
Старый 20.08.2012, 09:52
mss mss вне форума
Новичок
 
Регистрация: 29.10.2010
Сообщения: 50
Репутация: 10
По умолчанию

Цитата:
Сообщение от xNeKiToSx
Почему-то мой алгоритм не работает. Режим не блокирующий

Потому и не работает что неблокирующий, а тебе этот факт по барабану - ты упорно не желаешь реагировать на результат выполнения функционального метода SendBuf()
Ответить с цитированием
  #4  
Старый 20.08.2012, 21:06
xNeKiToSx xNeKiToSx вне форума
Прохожий
 
Регистрация: 23.01.2012
Сообщения: 10
Репутация: 10
По умолчанию

Код:
i:=0;
while not i=FStream do
i:=i+Sock.SendBuf(p^, FStream.Size);

так? если нет то как реагировать на эту функцию??
Ответить с цитированием
  #5  
Старый 23.08.2012, 21:20
mss mss вне форума
Новичок
 
Регистрация: 29.10.2010
Сообщения: 50
Репутация: 10
По умолчанию

Так как это делается в теле методов SendStream и SendStreamPiece.
Изучи досконально коды этих методов.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter