![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача файлов по сети [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)