Текущий архив: 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