Главная страница
    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.46 MB
Время: 0.04 c
15-1160223275
Adder
2006-10-07 16:14
2006.10.29
Anatoly Podgoretsky с днём рождения!


6-1149575747
Vavilon
2006-06-06 10:35
2006.10.29
Написание плагина для Internet Explorera


2-1160667272
Sam Stone
2006-10-12 19:34
2006.10.29
БД склада


1-1158653950
Pavelkq
2006-09-19 12:19
2006.10.29
try except и присвоение значения переменной


15-1159869480
syte_ser78
2006-10-03 13:58
2006.10.29
Помогите разобратся с "инфракрасным" подключением





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский