Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Передача файлов по сети   Найти похожие ветки 

 
ZeroSPiRiT   (2006-10-15 19:41) [0]

Имеется локальная сеть, на одном из компов висит сервак - 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, а при передаче второго файла, исчезает прогрессбар?


 
kami ©   (2006-10-15 20:23) [1]

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

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


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

OnSend что ли?

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


 
kami ©   (2006-10-15 21:03) [3]

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

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


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

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


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


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


см. Search -> Find Error ..


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.103 c
2-1160987510
pkm
2006-10-16 12:31
2006.10.29
МЕМО поле


2-1160955562
Silantiy
2006-10-16 03:39
2006.10.29
Rabota s documentami Word


15-1159680143
Александр_
2006-10-01 09:22
2006.10.29
Перевести с бумаги в AutoCAD


15-1160049524
kroner
2006-10-05 15:58
2006.10.29
HTML-редактор


3-1156855026
pic509
2006-08-29 16:37
2006.10.29
Как передать в Хранимую процедуру параметр=null