Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача файлов по сети [D7, XP]


ZeroSPiRiT ©   (2006-10-15 19:41:00) 

Имеется локальная сеть, на одном из компов висит сервак - TCPServer, на другом клиент - TCPClient.
Клиент должен отправлять серверу файлы, вот код для сервера:


procedure TForm1.fileserAccept(Sender: TObject;
 ClientSocket: TCustomIpClient);
const
 TIMEOUT = 1000;
 BUF_SIZE = 1024;
var
 buf: array [0..BUF_SIZE - 1] of Byte;
 file_size, read_current: Integer;
 read_total: Integer;
 FW :TFileStream;
 percent : integer;
 per : string;
 bu : real;

begin

 FW:=Tfilestream.Create('d:\Documents\' + oname,fmcreate);
 if ClientSocket.WaitForData(TIMEOUT) then
 begin
   if ClientSocket.ReceiveBuf(file_size, SizeOf(Int64)) = SizeOf(Int64)
then
   begin
     read_total := 0;
     form2.visible:= true;
     form2.Label2.Caption := oname;

     with FW do
     try
       while (read_total <> file_size) and ClientSocket.WaitForData(TIMEOUT) do
       begin
         read_current := ClientSocket.ReceiveBuf(buf, BUF_SIZE);
         Write(buf, read_current);
         Inc(read_total, read_current);
         bu := read_total/file_size*100;
         bu :=round(bu);
         per := floattostr(bu);

         percent := strtoint(per);
         form2.pr1.Position := percent;
         form2.Label3.caption := inttostr(percent) + '%';
          end;
       form2.pr1.Position := 0;
     form2.Label3.Caption := '0%';
     finally
     form2.visible := false;
     fw.Free;
    end;
   end;
 end;

end;

(нерационально, конечно :-))
Для клиента пишу так:


try

   with TFileStream.Create(filename, fmOpenRead) do
   try
     file_size := Size;
     cli.SendBuf(file_size, SizeOf(Int64));
     read_total := 0;
     while (read_total <> file_size) do
     begin
       read_current := Read(buf, BUF_SIZE);
       cli.SendBuf(buf, read_current);
       Inc(read_total, read_current);
       per := read_total/file_size*100;
       per := round(per);
       s := floattostr(per);
       percent := strtoint(s);
       l.Caption := s +'%';
       pr.Position := percent;
       Application.ProcessMessages;
     end;
   finally
   pr.Position := 0;
 
     Free;
   end;
  finally
   cli.Close;
   

end;

pr - это прогрессбар; а терь собсна вопрос: почему если передается первый файл, то всек проходит нормально, но в конце передачи вылезает access violation, а при передаче второго файла, исчезает прогрессбар?


zeroSPiRiT   (2006-10-16 15:58:00) [1]

Нету Search-Find Error :-) я начинающий, как проводить трассировку кода?


Сергей М.   (2006-10-16 12:17:00) [2]


> zeroSPiRiT   (16.10.06 12:14) [4]
>
> AV вылезает


см. Search -> Find Error ..


zeroSPiRiT   (2006-10-16 12:14:00) [3]

AV вылезает после того, как убирается форма2


kami   (2006-10-15 21:03:00) [4]

zeroSPiRiT   (15.10.06 20:31) [2]
Но первый-то файл передается

Но AV -то происходит :)


zeroSPiRiT   (2006-10-15 20:31:00) [5]

OnSend что ли?

Но первый-то файл передается


kami   (2006-10-15 20:23:00) [6]

Трассировал код? Где именно AV ?
Честно - неохота смотреть код, но первые же замечания по клиенту :
cli.SendBuf(buf, read_current);
Inc(read_total, read_current);

Кто сказал, что отправится именно read_current байт? Где анализ значения, возвращаемого SendBuf?
Зачем это while (read_total <> file_size) do? Не проще ли использовать OnWrite (или как там оно в TCPClient называется? - не пользовался ими, предпочитаю TClient|ServerSocket)


Наверх

Титульная страница Поиск, карта сайта Написать письмо