Главная страница
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.04 c
15-1159951239
stone
2006-10-04 12:40
2006.10.29
Новые телеканалы


3-1156856047
bmp2006
2006-08-29 16:54
2006.10.29
Сложный запрос


15-1160051232
Kolan
2006-10-05 16:27
2006.10.29
Дизайн - хорошая штука, но как его реализовать.


15-1160491821
Olegzhek
2006-10-10 18:50
2006.10.29
Файл ".OBJ" из С


3-1156870110
Telerion
2006-08-29 20:48
2006.10.29
Проблема с SQL запросом по датам. Сравнение дат. (paradox)